如何在相同的PHP代码中执行两个查询


How to execute two queries in the same PHP code?

我是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关键字冲突。尝试使用一致的前缀(例如messageReadisRead)