PHP-MySQLi Prepared Statement不能在代码中工作,但工作是PHPMyAdmin

时间:2013-09-12 22:34:04

标签: php mysqli

我正在运行一个准备好的语句,我收到以下错误。我不明白问题是什么。因为同样的查询在PHPMyAdmin中正常工作。

代码

$queryConstruct = "
    SELECT id FROM registrations WHERE 
        email = '$email' 
    AND 
        license_type = $license_type";

错误

致命错误:准备查询时出现问题( SELECT id FROM registration WHERE email ='test1@gmail.com'AND license_type = 0 )您的SQL出错句法;检查与您的MySQL服务器版本相对应的手册,以便在444行的mysqli.lib.php第2行的**''test1@gmail.com'和license_type = 0'**附近使用正确的语法

2 个答案:

答案 0 :(得分:2)

准备好的陈述看起来像这样

SELECT `id` 
FROM `registgrations` 
WHERE `email` = :email
AND `license_type` = :license_type

查看PDO手册文档以了解如何使用它。

http://php.net/manual/en/class.pdostatement.php

答案 1 :(得分:2)

这不是一份准备好的陈述,正如Rottingham所说的那样。 来自PHP Documentation

if ($stmt = $mysqli->prepare("SELECT id FROM Registrations WHERE email=? AND license_type=?")) {
    $stmt->bind_param("s", $email);
    $stmt->bind_param("s", $license_type);
    $stmt->execute();
    $stmt->bind_result($id);
    $stmt->fetch();
    printf("%s - %s - %s\n", $id, $email, $license_tpe)
    $stmt->close();
}

不确定我是否正确编辑过。无论如何,这应该暗示你所做的并不是准备好的陈述。

请注意,不是在查询中连接实际值,而是用占位符(在这种情况下为“?”)替换它们,然后用值绑定。这样,可以防止SQL Injection操纵您的查询,从而破坏您的数据。

更重要的是,请考虑学习PDO课程以获得更简单的方法。