为啥我在 PHP 中的 SQL 查询失败?

Posted

技术标签:

【中文标题】为啥我在 PHP 中的 SQL 查询失败?【英文标题】:Why is my SQL query in PHP failing?为什么我在 PHP 中的 SQL 查询失败? 【发布时间】:2017-09-11 22:38:35 【问题描述】:

我有一个应该返回数据库查询的 php 函数:

function editprojectform()
  global $conn;

  if(isset($_POST['project_id']))
    $project_id = $_POST['project_id']; 
    $sql = "SELECT * FROM projects WHERE Project_ID=".$project_id;
      if ($conn->query($sql) === TRUE) 
        echo "It works";
       else 
          echo "Error: " . $sql . "<br>" . $conn->error;
      
  

但是它打印出错误而不是打印出项目名称:

错误:SELECT * FROM projects WHERE Project_ID=3

我可以将这个确切的查询复制并粘贴到 PHPadmin 中,它会返回预期的结果。我想弄清楚为什么它在这里不起作用?我有一个非常相似的删除记录的功能,它工作正常。

谢谢。

【问题讨论】:

你的脚本有SQL Injection Attack的风险看看Little Bobby Tables发生了什么甚至if you are escaping inputs, its not safe!使用prepared parameterized statements。 Project_ID 是哪种数据类型? 很可能您将 id 作为字符串传递。因此,尝试将您的查询更改为:$sql = "SELECT * FROM projects WHERE Project_ID='".$project_id."'"; 将字符串包装成单引号。 这是因为它没有作为字符串传递,奇怪的是我在一个函数中有一个查询,它没有将它作为一个有效的字符串传递"DELETE FROM projects WHERE Project_ID=".$project_id; ... 您可以通过尝试普通查询$sql = "SELECT * FROM projects WHERE Project_ID=3"; 来验证它是否有效。如果可行,您可以确定 $project_id 是一个字符串。设置 $project_id 时,您也可以将值转换为 INT:$project_id = (int)$_POST['project_id']; 【参考方案1】:

我假设您使用的是mysqli::query。如果您阅读文档,尤其是 return values 部分,它会声明

失败时返回 FALSE。对于成功的 SELECT、SHOW、DESCRIBE 或 EXPLAIN 查询 mysqli_query() 将返回一个 mysqli_result 对象。为了 其他成功的查询 mysqli_query() 将返回 TRUE。

因此,由于您使用的是 SELECT 语句,因此该函数将返回 FALSE 或返回一个 not identical (===) 为 TRUE 的对象。所以,总会失败。

与 SELECT 语句不同,如果您使用 DELETE 语句,该函数将只返回 TRUE 或 FALSE。所以根据你的语句类型,函数会返回不同的值。

只需按照文档中的示例,将您的 IF 语句替换为 if ($result = $conn-&gt;query($sql))

【讨论】:

【参考方案2】:

在这种情况下,使用 PDO 会更好。

$db = $pdo->prepare('SELECT FROM projects WHERE Project_ID=:Project_ID');
$db->bindParam(':Project_ID', $project_id);
$db->execute();
$res = $db->fetchAll();

var_dump($res)

【讨论】:

以上是关于为啥我在 PHP 中的 SQL 查询失败?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 SQL 查询失败

为啥我的 SQL 查询在 MySQL 工作台中失败?

为啥此查询在 ODBC 表上运行但在本地表上运行时会失败?

当我从 SQL Server 代理运行 Python 脚本时,为啥它会失败?

为啥 import.sql 在 Spring Boot 中会失败?

相同的 SQl 查询在访问中运行,但在使用 java 的访问中的 sql 脚本中失败