试图学习mysqli准备好的陈述;我究竟做错了什么?

时间:2013-07-18 02:02:48

标签: php mysqli prepared-statement

这是我得到的错误......

Failed to prepare statement: (1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?.Pages WHERE slug='?'' at line 1

这是我的代码......

require_once("../database/config.php");

        $pageSlug = "home";

        $db = new mysqli(_DB_HOST, _DB_USER, _DB_PASSWORD, _DB_NAME);

        if ( $db->connect_errno ) {
            echo "Failed to connect to MySQL: (" . $db->connect_errno . ") " . $db->connect_error;
            exit();
        }

        if ( !$selectQuery = $db->prepare("SELECT * FROM ?.Pages WHERE slug='?'") ) {
            echo "Failed to prepare statement: (" . $db->errno . ") " . $db->error;
            exit();
        }

        if ( !$selectQuery->bind_param("ss", _DB_NAME, $pageSlug) ) {
            echo "Binding parameters failed: (" . $selectQuery->errno . ") " . $selectQuery->error;
            exit();
        }

        if ( !$selectQuery->execute() ) {
            echo "Exexute failed: (" . $selectQuery->errno . ") " . $selectQuery->error;
            exit();
        }

        echo "<pre>I GOT HERE!</pre>";
        exit();

../database/config.php只包含我在上面引用的全局变量(“_DB_NAME”等)。

我想我仍然只是围绕着这些准备好的陈述,并且不知道我做错了什么。

提前致谢!

1 个答案:

答案 0 :(得分:3)

预准备语句不能使用参数来提供标识符(模式名称,表名,列名等),因为在提供这些参数的值之前,它们被提交给DBMS以验证语法。

http://php.net/mysqli-prepare

  

标记仅在SQL语句的某些位置是合法的。对于   例如,它们被允许在INSERT语句的VALUES()列表中   (指定行的列值),或与列进行比较   在WHERE子句中指定比较值。但是,他们不是   在select中允许标识符(例如表名或列名)   用于命名SELECT语句要返回的列的列表,或   指定二元运算符的两个操作数,例如= equal   标志。后一种限制是必要的,因为它会   无法确定参数类型。这是不允许的   将标记与NULL比较?也是NULL。通常,参数是   仅在数据操作语言(DML)语句中合法,而不在   数据定义语言(DDL)语句

http://dev.mysql.com/doc/refman/5.0/en/prepare.html

  

参数标记只能在数据值出现的地方使用,   不适用于SQL关键字,标识符等。


但是,您可以使用动态SQL。例如:

$table = 'Example'; // Should be safe, avoid user input.
$sql   = "SELECT * FROM `{$table}` WHERE `id` = ?";
$stmt  = $db->prepare($sql);
// ...

<强> UPD:

我注意到,您在字符串参数标记周围使用单引号'。应该避免使用它们,因为dbms自己关心它们。 slug='?'应为slug = ?

仔细阅读:http://php.net/mysqli-prepare