簡體   English   中英

如何在此查詢中使用准備好的語句?

[英]How to use prepared statements in this query?

我是PHP和PDO的新手,我在這里嘗試使用准備好的語句。 經過一小時的嘗試,我放棄了。 否則我的教程太糟糕了。

編輯:

如果沒有准備好的語句,這將非常有效:

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();
}

foo應該替換為root。 但是,事實並非如此。

綁定時也嘗試使用名稱中的冒號:

$prepared->bindParam(':foo', 'root');

正如在文檔中所做的那樣: http : //php.net/manual/en/pdostatement.bindparam.php

您的bindParam的第二個參數必須是一個變量,否則會出現致命錯誤。 所以,

$value='root';
$prepared->bindParam('foo', $value);

要么:

$prepared->bindValue('foo', 'root');


很容易弄清楚何時顯示錯誤消息:

if ($in_development) ERROR_REPORTING(E_ALL);
// ... code

http://www.php.net/manual/zh/pdo.prepare.php那里的評論者說,它對於關鍵字,表名,視圖名和字段名無法正常工作,因此您需要$prepared = $dbh->prepare('SELECT * from ' . $table);

因為它僅對列變量有效。

您不能將params用於表和列名之類的東西,它只能用於數據,不能用於完全動態查詢

這應該工作:

$prepared = $dbh->prepare('SELECT * from sy_navigation_point WHERE Foo=:whatever');
$prepared->bindParam('whatever', 'Bar');

編輯:這應該是真正的解決方案。

通過查看文檔 ,很明顯該模式必須為:

$prepared = $dbh->prepare('SELECT * from sy_navigation_point WHERE Foo=:whatever');
$prepared->bindParam('whatever', $value);

然后,您執行以下操作:

$value = 'Bar';
$prepared->execute();

您不能在MySQL准備語句中綁定表,而只能綁定值。 手冊

但是,不允許使用它們作為標識符(例如表名或列名)或指定二進制運算符的兩個操作數(例如=等號)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM