2015-01-31 96 views
0

我运行到错误使用insert into表PHP PDO bind_param错误

JSON:

{"machine":"1","postage":"1","tracking":"1","lve":"1","notice":"4","content":"12","refresh":"1","location":"cityname"} 

我怎样才能这是怎么回事?

THX

编辑 固定的错误,你们提到

function addOptions ($postData, $dbh) { 

//print_r($postData); 
$result = json_decode($postData); 
//$location = $result->location; 
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$sql = "INSERT INTO options (location, display_time ,content_time, refresh_time, machine_data, postage_data, tracking_data, lve_data) 
        VALUES (:location, :display_time, :content_time, :refresh_time, :machine_data, :postage_data, :tracking_data, :lve_data) 
        ON DUPLICATE KEY UPDATE 
        display_time= :display_time, refresh_time= :refresh_time, machine_data= :machine_data, content_time= :content_time, postage_data= :postage_data, tracking_data= :tracking_data, lve_data= :lve_data"; 
$preparedStatement = $dbh->prepare($sql); 
$preparedStatement->bindParam(':location', $result->location); 
$preparedStatement->bindParam(':display_time', $result->display); 
$preparedStatement->bindParam(':content_time', $result->content); 
$preparedStatement->bindParam(':refresh_time', $result->refresh); 
$preparedStatement->bindParam(':machine_data', $result->machine); 
$preparedStatement->bindParam(':postage_data', $result->postage); 
$preparedStatement->bindParam(':tracking_data', $result->tracking); 
$preparedStatement->bindParam(':lve_data', $result->lve); 
$preparedStatement->execute(); 

} 

现在我得到这个错误味精

警告:PDOStatement对象::执行()预计参数1是数组,字符串给出D:\ xampp \ htdocs \ admin \ include \ function.php on line 186

+0

看起来像是你忘记打电话'$ preparedStatement时= $ dbh->准备($ SQL);' – 2015-01-31 20:21:11

+2

这并不能完全解释为什么它抱怨一个布尔值,而不是一个非对象或未定义的变量。是否有更多的代码没有显示? – 2015-01-31 20:22:18

+0

你在哪里调用'prepareStatement'? – ethrbunny 2015-01-31 20:22:23

回答

2

你忘了创建您准备语句,尝试这种绑定的参数之前:

$preparedStatement = $dbh->prepare($sql); 

编辑:

只要改变这一点:

(既然你已经绑定您可以执行查询的参数!否则,该参数用于执行将包括准备好的语句的参数)

$preparedStatement->execute($sql); 

这样:

$preparedStatement->execute(); 

有关PDO的execute()命令的详细信息,请参阅手册:http://php.net/manual/en/pdostatement.execute.php

并从那里引用:

public bool PDOStatement :: execute([array $ input_parameters])

+0

这里比OP发布的还多。必须有,因为该变量甚至不会被定义,并且SQL INSERT语法会被混淆。 – 2015-01-31 20:24:59

+0

@MichaelBerkowski是的,你可能是对的! (请阅读您对WH​​ERE子句的评论,这很奇怪) – Rizier123 2015-01-31 20:25:55

1

几个错误:

  1. 添加PDO准备:

    $preparedStatement = $dbh->prepare($sql); 
    
  2. 改变所有bind_param这样:

    $preparedStatement->bindParam(':display', $result->display); 
    
  3. 添加执行进入一个如果条件,所以你看它是否工作:

    if($preparedStatement->execute() === FALSE){ 
    
        Throw new \Exception('Bad query insertion!'); 
    }