【问题标题】:Attempting to learn mysqli prepared statements; what am I doing wrong?尝试学习 mysqli 准备好的语句;我究竟做错了什么?
【发布时间】:2013-07-18 02:02:48
【问题描述】:

这是我遇到的错误...

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

我想我仍然只是在这些准备好的陈述事情上纠结,并不真正知道我做错了什么。

提前致谢!

【问题讨论】:

标签: php mysqli prepared-statement


【解决方案1】:

准备好的语句不能使用参数来提供标识符(模式名、表名、列名等),因为它们在提供这些参数的值之前被提交给 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);
// ...

UPD:

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

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

【讨论】:

  • 想详细说明“动态SQL”吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 2011-07-09
  • 2016-07-18
相关资源
最近更新 更多