这是我得到的错误。。。
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"等)。
我想我还是沉浸在这些事先准备好的陈述中,不知道自己做错了什么。
提前感谢!
Prepared语句不能使用参数来提供标识符(架构名、表名、列名等),因为它们在提供这些参数的值之前会提交给DBMS以验证语法。
http://php.net/mysqli-prepare
标记仅在SQL语句中的某些位置是合法的。对于例如,INSERT语句的VALUES()列表中允许使用它们(为行指定列值),或在与列的比较中在WHERE子句中指定比较值。然而,它们不是允许使用标识符(如表或列名)列出SELECT语句要返回的列的名称,或者指定二进制运算符的两个操作数,例如=equal后一个限制是必要的,因为无法确定参数类型。这是不允许的将标记与NULL进行比较?IS也为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.