2016-02-08 51 views
2

我遇到了這個查詢的麻煩。此查詢導致以下錯誤。Drupal 8 PDO Prepared Statements bindValue錯誤

PDOException:SQLSTATE [HY093]:無效的參數號:無參數的約束

$sql = "INSERT IGNORE table SET user_id = :uid"; 
if ($con = $connection->prepare($sql)) { 
    $con->bindValue(':uid', intval($this->uid), PDO::PARAM_INT); 
    $con->debugDumpParams(); 
    $con->execute(); 
} 

參數

Params: 1 
Key: Name: [4] :uid 
paramno=-1 
name=[4] ":uid" 
is_param=1 
param_type=1 

查詢工作。

$sql = "INSERT IGNORE table SET user_id = :uid"; 
if ($con = $connection->prepare($sql)) { 
    $con->execute([':uid' => intval($this->uid)]); 
} 

問題爲什麼我不能綁定任何參數或值的PDO預處理語句?

我正在使用Drupal 8,我相信他們的連接取代了PDO默認驅動程序。

+0

http://php.net/manual/en/pdostatement.bindparam.php –

+0

我建議在'execute'中傳遞參數,除非你使用'blobs' 。它工作非常可靠。 –

+0

@RyanVincent它可能與Drupal的自定義驅動程序有關。我用幾種不同的方式改變了這個查詢。有沒有辦法調試PDO語句並獲得驅動程序配置? – Neoaptt

回答

1

Drupal 8使用Drupal用來插入,更新,準備語句等的自定義驅動程序替換默認的PDO驅動程序......這些驅動程序將覆蓋默認操作。所以如果你想要一個完整的自定義查詢,你將需要建立自己的連接與Drupal分開並使用它。

$dsn = 'mysql:host=localhost;dbname=drupal'; 
$username = 'username'; 
$password = 'password'; 
$connection = new PDO($dsn, $username, $password); 

然後使用自定義查詢將工作。你不會得到沒有參數被綁定錯誤

+0

只是一個說明。對於所討論的特定示例,不需要手動綁定,因此不需要任何專用連接。 –