2013-07-17 198 views
0

我需要幫助創建一個動態mysqli準備語句的方法。下面的代碼有錯誤。我知道我完全用mysqli_stmt_bind_param設置了方式,但是我找不到解決方案。我的編碼風格可能很奇怪,因爲我使用的是OO php,但是程序性的mysqli。自從我閱讀/觀看的書籍和視頻使用過程式mysqli以來,我沒有時間弄清楚OO mysqli。我見過的大部分解決方案都是使用OO mysqli。我寧願爲此短期修復,而不是在花了很多時間學習mysqli之後學習PDO。動態mysqli準備語句

public function create($sql, $param_type, $param){ 
    //param_type should be set as $param_type = "'ssss'" so that single quotes get passed into the variable 
    //param should be an array 
    //param array items should be escaped 
    $stmt = mysqli_prepare($this->dbc, $sql); 
    mysqli_stmt_bind_param($stmt, $param_type, join(array_values($param), ", ")); 
    $result = mysqli_stmt_execute($stmt); 

    if($result){ 
     return true; 
    } else{ 
     return false; 
    } 
    mysqli_stmt_close($stmt); 
} 

回答

1

要使用OO的mysqli很簡單:

  1. 改變每mysqli_blah($this->dbc)調用$this->dbc->blah()
  2. 更改每個mysqli_stmt_blah($stmt)致電$stmt->blah()
  3. 利潤!

此外,總是prepare()和​​檢查返回值。當解析或執行出現錯誤時,它們將返回false,並且您需要檢查這些錯誤並每次報告錯誤

mysqli_stmt_bind_param()功能是棘手的,因爲它需要一個可變數目的參數,一個用於在參數類型參數的每個字母,逗號分隔的值的字符串。此外,它要求您通過引用傳遞變量,而不是標量,而不是單個數組。

  • WRONG:mysqli_stmt_bind_param($stmt, "sss", "red,green,blue");

  • WRONG:mysqli_stmt_bind_param($stmt, "sss", "red", "green", "blue");

  • WRONG:mysqli_stmt_bind_param($stmt, "sss", $param_array);

  • RIGHT:mysqli_stmt_bind_param($stmt, "sss", $param1, $param2, $param3);

這使得困難和混亂,無法做你正在做的事情:編寫一個通用函數來準備和執行一個帶有動態數量參數的SQL語句。您必須使用call_user_func_array(),但必須將參數數組重寫爲引用數組。

我寫的例子,一對夫婦的我的過去,這樣的答案:

PDO解決了這個更容易,你沒有任何約束,你只要將數組傳遞給​​。