2015-05-03 96 views
2

我的代碼 -bindValue在INSERT不會工作

$con = new PDO ('mysql:host=localhost;dbname=air','root','123456'); 
    $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    $fields = implode(", ", $fields); 
    echo $fields; 
    $values = implode("','", $values); 
    echo $values; 

    // have to make this prevent sql injection // 
    // it wont work if i added bindValue why? // 
    $stmt = $con->prepare("INSERT INTO $table(ID, $fields) VALUES (?, ?)"); 
    $stmt->bindValue(1,'',PDO::PARAM_STR); 
    $stmt->bindValue(2,$values,PDO::PARAM_STR); 
    $stmt->execute(); 

    //if I remove `bindValue` and replace this it will insert // 
    $stmt = $con->prepare("INSERT INTO $table(ID, $fields) VALUES ('', $values)"); 

爲什麼我添加bindValue之後我插入不會再工作,但是當我使用正常sql,它會工作,有什麼毛病我bindValue和VALUES(? ,?),誰能幫我看看?

+1

「不工作」是否會導致您可能想要顯示的錯誤消息? $ fields和$ values包含什麼?你爲什麼不通過' - > execute([...])'來傳遞它們呢? – mario

+0

由於您將'$ values'作爲字符串數組插入,因此您應該動態構建問號佔位符 – Ghost

+0

您無法批量綁定字段。你必須單獨綁定他們。此外,要爲您的id字段綁定null,請使用'bindValue(2,NULL,PDO :: PARAM_NULL);' – Sebas

回答

-1

我不確定$字段和$值是什麼,但我認爲這些沒有錯。您正嘗試將字符串的bindValue傳遞給id字段。你可以嘗試將其更改爲PDO :: PARAM_INT?

+0

測試不會工作我嘗試重新編輯$字段$值上的代碼 – user3233074

0

我在這裏遲到了,但一個簡單的方便的功能,可以使用任何人搜索的答案來實現綁定和插入到任何表和字段。沒有包括PDO::PARAM_STR作爲它的默認螞蟻我看到你的領域都是string值。希望這會有所幫助:)

//get array containing fields and its values to be added $fv_array 
$fv_array=array(
"field_one_name"=>$field_one_value, 
"field_two_name"=>$field_two_value, 
"field_three_name"=>$field_three_value 
); 

$con=new PDO ('mysql:host=localhost;dbname=air','root','123456'); 
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$fv=""; 
//create string like :field_one_name,:field_two_name,:field_three_name, 
foreach($fv_array as $field=>$value {$fv.=":".$field.",";} 
//rtrim removes trailing comma 
$statement=$con->prepare("INSERT INTO ".$table." (".implode(",",array_keys($fv_array)).") VALUES (".rtrim($fv, ",").")"); 
//bind values 
foreach($fv_array as $field=>$value){$statement->bindValue(':'.$field,$value);} 
$statement->execute();