0

まず第一に、私は PHP/MySQL に非常に慣れておらず、他の人が私のコードが MySQL インジェクションに脆弱であることを指摘していることを認識していますが、現在、セキュリティに移る前に機能の学習に取り組んでいます。

わかりましたので、コーディングの理解を助けるためにプライベートメッセージングシステムをゼロから構築しています。返信文字列で「to_user」データをPOSTしようとしているところで障害にぶつかりました。他のすべてを正常に取得できます投稿しますが、「to_user」(PM を送信した人) と件名のデータは引き継がれません。

これが私の「view_pm.php」ファイルです。

<?php
include 'core/init.php';
include 'includes/overall/header.php';
?>
<?php include "includes/inbox-menu.php"; ?>

<table>
<?php
$id = $_GET['id'];
$to_user = $user_data['user_id'];
$sql = "SELECT users.user_id, users.username, users.profile, messages.id, messages.to_user, messages.from_user, 
        messages.subject, messages.message, messages.has_read, messages.deleted, messages.date_sent
        FROM `messages`
        JOIN `users` ON messages.from_user = users.user_id 
        WHERE messages.to_user = '$to_user' AND messages.id = '$id' ORDER BY messages.date_sent DESC";
$result = mysql_query($sql);
$rows = mysql_fetch_array($result);
?><tr>
<td width="50px" align="center">
<img src="<?php echo $rows['profile']; ?>" width="40px"><br><?php echo $rows['username']; ?>
</td>
<td valign="top" width="350px">
<b><?php echo $rows['subject']; ?></b><br>
<?php echo $rows['message']; ?>
</td><td><?php echo $rows['date_sent']; ?></td>
</tr>
<tr>
<td colspan="3"><hr></td>
</tr>

<?php
$sql2 = "SELECT users.user_id, users.username, users.profile, messages.id, messages.reply_id, messages.to_user, messages.from_user, 
        messages.subject, messages.message, messages.has_read, messages.deleted, messages.date_sent
        FROM `messages`
        JOIN `users` ON messages.from_user = users.user_id 
        WHERE messages.to_user = '$to_user' AND messages.reply_id = '$id' ORDER BY messages.date_sent DESC";

$result2 = mysql_query($sql2);
while ($rows = mysql_fetch_assoc($result2)) {
?>
<tr>
<td width="50px" align="center">
<img src="<?php echo $rows['profile']; ?>" width="40px"><br><?php echo $rows['username']; ?>
</td>
<td valign="top" width="350px">
<b><?php echo $rows['subject']; ?></b><br>
<?php echo $rows['message'] ?>
</td><td><?php echo $rows['date_sent']; ?></td>
</tr>
<tr>
<td colspan="3"><hr></td>
</tr>

<?php } ?>
</table>

<form method="post" action="parsers/reply_pm.php">
Reply: <textarea name="message"></textarea><br>
<input type="hidden" name="from_user" value="<? echo $to_user; ?>">
<input type="hidden" name="to_user" value="<? echo $rows['from_user']; ?>">
<input type="hidden" name="subject" value="<? echo $rows['subject']; ?>">
<input type="hidden" name="reply_id" value="<? echo $id ?>">
<input type="submit" name="submit" value="Send Message">
</form>

<?php include 'includes/overall/footer.php'; ?>

そして、これが私の「reply_pm.php」ファイルです。

<?php
include '../core/init.php';

$reply_id = $_POST['reply_id'];
$to_user = $_POST['to_user'];
$from_user = $user_data['user_id'];
$subject = $_POST['subject'];
$message = $_POST['message'];

echo $sql = "INSERT INTO `messages`
        (reply_id, to_user, from_user, subject, message, date_sent)
        VALUES
        ('$reply_id','$to_user','$from_user','$subject','$message',now())";
$result = mysql_query($sql);
exit();
if($result){
    header("Location: ../view_pm.php?id=$reply_id");
    } else {
    echo "Error sending message.";
    }
?>

そして、テスト中に結果をエコーし​​ていることに気付いているかもしれませんし、気付いていないかもしれません。現在、返されています..

INSERT INTO messages( reply_id, to_user, from_user, subject, message, date_sent ) VALUES ( '8','','1','','テスト返信がここに入る',now() )

前もって感謝します。

4

1 に答える 1

0

PHP について知っておくべきことの 1 つは、2 つの角かっこ内で定義する変数は{}そこでのみアクセスできるため、使用したコードで

while ($rows = mysql_fetch_assoc($result2)) {

ブラケットを閉じた後、変数にアクセスできない閉じたブラケットまで、開いた$rowsブラケットで定義されます。お気に入り :{<?php } ?>

<input type="hidden" name="to_user" value="<? echo $rows['from_user']; ?>">

ステートメントの前に変数を定義し、while後で次のように使用する必要があります。

$from_user = "";
while ($rows = mysql_fetch_assoc($result2)) {
$from_user = $rows['from_user'];
.....
}
<input type="hidden" name="to_user" value="<? echo $from_user; ?>">

これについてもっと読む:

http://php.net/manual/en/language.variables.scope.php

http://www.w3schools.com/php/php_variables.asp

于 2013-09-02T06:15:39.660 に答える