为啥我在 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->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 Server 代理运行 Python 脚本时,为啥它会失败?