我是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();
?>
是的,它给了我一个错误。错误是"您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在'read='Y' WHERE消息附近使用正确的语法。ID='7 " at line 1"
read
是MySQL的保留字
- http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html
在列名前后使用反号。
例如:SET `read`='Y'
或者用另一个词来表示
但是它没有显示任何错误信息。
那是因为你没有检查错误。在打开<?php
标记后,将错误报告添加到文件的顶部error_reporting(E_ALL); ini_set('display_errors', 1);
包括or die(mysql_error())
用于第二个查询,您不像第一个查询那样做。
另外,你的代码很容易被SQL注入与你正在使用的当前(和已弃用的)MySQL API。
使用 mysqli_*
和预编译语句,或者PDO和预编译语句。
在您的问题下面留下了关于代码中其他安全相关问题的注释。
引用Brad的评论:
只是将文本数据直接回显到HTML中而不进行转义。您必须使用
htmlspecialchars()
,否则您可能会创建无效的HTML并使您自己暴露于XSS攻击。
这里有一些关于SQL注入主题的链接:
- https://en.wikipedia.org/wiki/SQL_injection
- http://php.net/manual/en/security.database.sql-injection.php
- https://www.owasp.org/index.php/SQL_Injection 如何在PHP中防止SQL注入?
跨站脚本编写
- https://www.owasp.org/index.php/Cross-site_Scripting_ (XSS)
- https://en.wikipedia.org/wiki/Cross-site_scripting
您正在使用保留的MySQL单词(如READ
)作为列名
修改
$query2="UPDATE health.messages SET read='Y' WHERE messages.ID='".$id."';";
$query2="UPDATE health.messages SET `read` = 'Y' WHERE messages.ID='".$id."';";
我还建议你注意其他人关于使用过时的MySQL函数和SQL注入问题的警告。
你还应该尝试更独特的命名列,不要与保留的MySQL关键字冲突。尝试使用一致的前缀(例如messageRead
或isRead
)