我是PHP和PDO的新手,我尝试在这里使用预处理语句。经过1小时的尝试,我放弃了。或者我的教程非常糟糕。
修改
如果没有准备好的陈述,这种方法很完美:
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
$prepared = $dbh->prepare('SELECT * from sys_navigation_point WHERE name="root"');
//$prepared->bindParam('foo', 'root');
$prepared->execute();
foreach($prepared as $row) {
print_r($row);
}
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
但这对于准备好的声明根本不起作用。在执行此操作时获取完全空白的页面:
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
$prepared = $dbh->prepare('SELECT * from sys_navigation_point WHERE name=:foo');
$prepared->bindParam('foo', 'root');
$prepared->execute();
foreach($prepared as $row) {
print_r($row);
}
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
应该用root替换foo。但是,它没有。
答案 0 :(得分:5)
在绑定时也尝试使用名称中的冒号:
$prepared->bindParam(':foo', 'root');
正如在文档中所做的那样:http://php.net/manual/en/pdostatement.bindparam.php
答案 1 :(得分:2)
您的bindParam
第二个参数有是变量,否则您将收到致命错误。所以,
$value='root';
$prepared->bindParam('foo', $value);
或:
$prepared->bindValue('foo', 'root');
很容易弄清楚何时显示错误消息:
if ($in_development) ERROR_REPORTING(E_ALL);
// ... code
答案 2 :(得分:1)
http://www.php.net/manual/en/pdo.prepare.php
一位评论者说它对关键字,表名,视图名和字段名不起作用
所以你需要$prepared = $dbh->prepare('SELECT * from ' . $table);
因为它只适用于列变量。
答案 3 :(得分:1)
你不能将params用于表格和列名这样的东西,它只能用于数据,而不能用于完全动态的查询
这应该有效:
$prepared = $dbh->prepare('SELECT * from sy_navigation_point WHERE Foo=:whatever');
$prepared->bindParam('whatever', 'Bar');
编辑:这应该是真正的解决方案。
通过查看documentation,很明显模式必须是:
$prepared = $dbh->prepare('SELECT * from sy_navigation_point WHERE Foo=:whatever');
$prepared->bindParam('whatever', $value);
然后你做:
$value = 'Bar';
$prepared->execute();
答案 4 :(得分:0)
您无法在MySQL预处理语句中绑定表,您只能绑定值。来自the manual:
但是,不允许使用标识符(例如表名或列名), 或者指定二元运算符的两个操作数,例如=等号。