我是PHP编程的新手。我想在相同的PHP代码上执行2个查询。第一个查询给了我预期的结果。但第二个查询似乎无法正常工作。但它没有向我显示任何错误消息。有人能帮助我吗?
<?php
mysql_connect('localhost','root','');
mysql_select_db('health');
$query1="SELECT * FROM messages,doctor WHERE doctor.regNo=messages.regNo AND messages.ID='".$id."';";
$result1=mysql_query($query1) or die(mysql_error());
$row=mysql_fetch_array($result1);
echo '<table cellspacing="10">';
echo '<tr><td><b>From: </b></td><td>Dr. '.$row['firstName'].' '.$row['lastName'].'</td></tr>';
echo '<tr><td><b>Category: </b></td><td>'.$row['category'].'</td></tr>';
echo '</table>';
echo '<p style="padding-left:13px;">'.$row['reply'].'</p>';
echo '</br><b style="padding-left:13px;">Your question</b></br>';
echo '<p style="padding-left:13px;">'.$row['question'].'</p>';
$query2="UPDATE health.messages SET read='Y' WHERE messages.ID='".$id."';";
$result2=mysql_query($query2);
mysql_close();
?>
答案 0 :(得分:2)
是的,它给了我一个错误。错误是“您的SQL语法中有错误;请检查与您的MySQL服务器版本对应的手册,以便在第1行的'read ='Y'WHERE messages.ID ='7''附近使用正确的语法”< / p>
read
是MySQL保留字
在列名称周围使用反引号。
例如:
SET `read`='Y'
或使用其他词语。
但它没有向我显示任何错误消息。
那是因为你没有检查错误。在打开<?php
标记后立即将错误报告添加到文件顶部
error_reporting(E_ALL); ini_set('display_errors', 1);
包括第二个查询的or die(mysql_error())
,您没有像第一次查询那样进行查询。
另外,您的代码非常容易使用您正在使用的当前(和已弃用的)MySQL API进行SQL注入。
使用mysqli_*
with prepared statements或PDO与prepared statements。
关于代码中与安全相关的其他问题,您的问题已经留下了评论。
引用布拉德的评论:
您只是将文本数据直接回显到HTML而没有转义。您必须使用
htmlspecialchars()
,否则可能会产生无效的HTML并使自己受到XSS攻击。
以下是一些您可以阅读SQL注入主题的链接:
跨站点脚本(XSS)
答案 1 :(得分:1)
您正在使用保留的MySQL字词(例如READ
)作为列名。
要解决此问题,请更改行
$query2="UPDATE health.messages SET read='Y' WHERE messages.ID='".$id."';";
到
$query2="UPDATE health.messages SET `read` = 'Y' WHERE messages.ID='".$id."';";
我还建议你留意其他人关于使用depreceated MySQL函数和SQL注入问题的警告。
您还应尝试使用不会与reserved MySQL keywords发生冲突的列命名,从而更加独特。尝试使用一致的前缀(例如messageRead
或isRead
)