如何在此查询中使用预准备语句?

时间:2009-12-22 13:47:45

标签: php pdo prepared-statement

我是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。但是,它没有。

5 个答案:

答案 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

  

但是,不允许使用标识符(例如表名或列名),   或者指定二元运算符的两个操作数,例如=等号。