1

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

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”等)。

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

提前致谢!

4

1 回答 1

3

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

http://php.net/mysqli-prepare

标记仅在 SQL 语句中的某些位置是合法的。例如,它们可以在 INSERT 语句的 VALUES() 列表中使用(以指定行的列值),或者在与 WHERE 子句中的列进行比较以指定比较值时。但是,它们不允许用于标识符(例如表名或列名),在命名要由 SELECT 语句返回的列的选择列表中,或指定二元运算符(例如 = 等号)的两个操作数。后一个限制是必要的,因为不可能确定参数类型。不允许将标记与 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);
// ...

升级版:

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

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

于 2013-07-18T02:07:10.277 回答