2011-07-21 95 views
0

我已經構建了一個函數,它將準備SQL語句並使用給定的參數執行它。因此,這裏的樣子:PDO Mysql SQLSTATE [42000]

function go($statement) { 
    $q = self::$connection->prepare($statement, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 

    for($i = 1; $i < func_num_args(); $i++) { 
     $arg_to_pass = func_get_arg($i); 
     $q->bindParam($i, $arg_to_pass, PDO::PARAM_INT); 
    } 
    $q->execute(); 
} 

但是,當我把它,它給了我下面的錯誤:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;

然而,這兩種變型完美的工作:

function go($statement) { 
    $q = self::$connection->prepare($statement, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 

    for($i = 1; $i < func_num_args(); $i++) { 
     $q->bindValue($i, func_get_arg($i), PDO::PARAM_INT); 
    } 
    $q->execute(); 
} 

(這個很笨,但只是爲了測試)

function go($statement) { 
    $q = self::$connection->prepare($statement, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 

    $arg_to_pass = func_get_arg(1); 
    $q->bindParam(1, $arg_to_pass, PDO::PARAM_INT); 

    $arg_to_pass2 = func_get_arg(2); 
    $q->bindParam(2, $arg_to_pass2, PDO::PARAM_INT); 

    $q->execute(); 
} 

那麼爲什麼bindParam不能在循環內工作?

回答

1

我猜這是因爲你打破了綁定 - 你將參數提取到$arg_to_pass,然後綁定它。在下一次迭代中,您將另一個arg讀入同一變量(現在綁定爲參數#1)並嘗試將其重新綁定爲參數#2。其他版本都使用唯一的參數名稱(來自func_get_args的直接返回值,不同的var名稱等)。

0

我不知道爲什麼你會得到這個消息,但我會說問題是你想使用PDOStatement :: bindParam(),它作爲一個引用綁定,只獲取當你調用PDOStatement :: execute()時變量,但是到那時爲止,原來的變量被一個新的值覆蓋了。

請使用PDOStatement :: bindValue(),以便在循環內複製該值,或者使用帶有bindParam的唯一變量引用。

相關問題