PHP在boolean上调用成员函数execute(),无法找到错误的内容

时间:2016-11-07 21:21:30

标签: php mysql mysqli

我的php函数无法正常工作,我无法找到原因,它会在布尔值"上抛出"调用成员函数execute()在我脸上的错误,谁能告诉我我做错了什么?

$projectName = $_POST['project_name'];

$getProjectId = $mysqli->prepare('SELECT project_id FROM projects WHERE project_name = '.$projectName);
$getProjectId->execute();
$getProjectId->bind_result($projectId);
$_SESSION['projectID'] = $projectId; 

是的,数据库连接正常,它适用于其他功能。

2 个答案:

答案 0 :(得分:2)

你做错了。

使用Prepared Statements的重点(,其中一个主要)是您设置语句然后单独插入变量,以便变量永远不会对SQL语句构成风险。

您的SQL查询:

$getProjectId = $mysqli->prepare('SELECT project_id FROM projects 
                WHERE project_name = '.$projectName);

您现在所拥有的是一份准备好的声明,其形状就像是一个标准的未经准备的老式MySQLi声明。这意味着变量$projectName可以包含任何数据,并且可以直接滥用您的SQL查询。

您需要做的是将变量替换为占位符,然后稍后添加变量,这称为准备 SQL,有一个很多的指导在Stackoverflow和整个互联网上关于这样做,所以请研究它,但结果将如下所示:

    $getProjectId = $mysqli->prepare("SELECT project_id FROM projects 
                    WHERE project_name = ?");
    $getProjectId->bind_param("s",$projectName);
    $getProjectId->execute();

    //carry on as before

bind_param代码将变量插入?占位符位置,完全避免了SQL注入问题。

回答您的问题

MySQL使用反引号

   ` <== This, typically next to the number 1 on your keyboard

并使用单引号',因此当您在SQL字符串中有列名和/或引用值名称时,它们将被包含在单引号中。如果在PHP中用单引号括起整个字符串,这将导致问题。这是您在这里遇到的错误。

您的原始查询:

   'SELECT project_id FROM projects WHERE project_name = '.$projectName

应该(忽略上面的细节,确实应该做好准备):

 "SELECT project_id FROM projects WHERE project_name = '$projectName' "

我希望你能注意到字符串现在被双引号括起来,并且列值被单引号括起来。

Aslo,正如djxyz和Aynbar在评论中所说,你真的应该考虑获得错误反馈,以便MySQL可以告诉你为什么查询不起作用,错误消息在两者中都非常有用MySQL和PHP。

结论

正确使用预准备语句会否定您最初使用引号中的列名称时出现的主要语法错误(如果它是占位符?则不需要)。总是习惯用双引号"编写SQL字符串来回避这些问题。

最后,请注意PDOMySQLi的语法略有不同(所以当您阅读SO帖子时,请尝试确定代码是MySQLi还是复制之前PDO

正确使用准备好的声明会为你的编码器能力带来奇迹。它还可以使您的代码更安全。它偶尔可以帮助你在派对上交流。

答案 1 :(得分:1)

当查询包含错误时,

$mysqli->prepare会返回false。您应该在准备语句后面检查$mysqli->error$mysqli->errno,以找出查询的错误。