使用pdo prepared语句将数据插入数据库

时间:2012-11-19 20:10:09

标签: php pdo

使用pdo准备好的语句将数据插入数据库,对我无效:

我使用这个功能:

    public function get_number_of_matches(){
     $stmt = $this->pdo->prepare("INSERT INTO `words`( `word_name`, `word_count`, `search_id`) VALUES (:word, :count,:searchID)");
       $stmt->bindParam(':word', $word);
       $stmt->bindParam(':count', $count);
       $stmt->bindParam(':searchID', $search_id);
   for($i=0;$i<count($this->words);$i++){
     if(preg_match_all('/'.$this->words[$i].'/i', $this->text,$matches)){
       $count=count($matches[0]);
       $word=$this->words[$i];
        $search_id=1;
       $stmt->execute();
         break;
    }   

   }
    return 0;
}

基本上,我尝试循环遍历值并将它们放入数据库中..没有给出错误..没有任何内容进入数据库..为什么?

这就是我连接数据库的方式:

 class DBConnection {
    public static $connect;

    public static function connect(){

        if(!isset(self::$connect)){
            try{
              self::$connect=new PDO('mysql:host=localhost;dbname=tweeter', 'root', '');
            }catch(Exception $ex){
               echo $ex->getMessage();   
            }
        }
        return self::$connect;
    }
}

更新 也..见这里:

我使用不同的查询做同样的事情。但是当我尝试将对象属性放在变量中时,我得到一个错误:

$ tweet = $ tweet-&gt; tweet;         $用户= $ tweet-&GT; tweeter_name;         $ link = $ tweet-&gt; link;

这些变量进入查询:

       $pdo=  DBConnection::connect();
    $stmt = $pdo->prepare("INSERT INTO `tweets`( `tweet`, `tweeter_name`, `link`, `date`, `search_id`) VALUES (:tweet, :tweeter_name, :link, :date, :search_id)");
      $stmt->bindParam(':tweet', $tweet);
       $stmt->bindParam(':tweeter_name', $user);
       $stmt->bindParam(':link', $link);
       $stmt->bindParam(':date', $date);
       $stmt->bindParam(':search_id', $search_id);

我得到这样的错误:

  

注意:尝试在第36行的C:\ xampp \ htdocs \ Twitter \ demo.php中获取非对象的属性

注意:尝试在第37行的C:\ xampp \ htdocs \ Twitter \ demo.php中获取非对象的属性

注意:尝试在第38行的C:\ xampp \ htdocs \ Twitter \ demo.php中获取非对象的属性

我可以打印属性..但是当它们分配给那些绑定的变量时......上面的错误就会出现

我也得到了这个:

  

致命错误:未捕获异常'PDOException',消息'SQLSTATE [23000]:完整性约束违规:1048列'tweeter_name'在C:\ xampp \ htdocs \ Twitter \ demo.php中不能为空':40堆栈跟踪: #0 C:\ xampp \ htdocs \ Twitter \ demo.php(40):在第40行的C:\ xampp \ htdocs \ Twitter \ demo.php中抛出PDOStatement-&gt; execute()#1 {main}

我检查过这样:

    $tweet= "111111"; // $tweet->tweet ;
        $user= "22222222"; // $tweet->tweeter_name;
        $link= "3333333";  // $tweet->link;
        $date= "444444";

它工作..出于某种原因它讨厌那些对象属性?!?

这应该作为输入:

  RT @OrganicLiveFood:科学家警告#EPA超过#Monsanto的#GMO作物失败&amp;危险#prop37 #labelGMO#yeson37 http://t.co/2XhuVxO8   Doumastic   TweetCaster for iOS   星期一,2012年11月19日20:40:55 +0000   RT @OrganicLiveFood:科学家警告#EPA超过#Monsanto的#GMO作物失败&amp;危险#prop37 #labelGMO#yeson37 http://t.co/2XhuVxO8

但它不......?!?

2 个答案:

答案 0 :(得分:1)

连接后立即添加self::$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

这将确保PDO会在每个错误上抛出PDOExceptions,使它们很容易看到。然后错误会勾勒出错误的原因。

答案 1 :(得分:1)

检查$stmt->execute()的返回值,如果出现问题,将返回false,您应该查看$stmt->errorInfo()了解详细信息。

或者使用@Madara Uchiha建议的ERRMODE_EXCEPTION,但是如果你还没有处理应用程序中的异常,那么这很难适应。


Re:你的更新。

每次调用时,都应检查PDO::prepare()PDOStatement::execute()的错误状态。 “尝试获取非对象属性”的错误可能意味着$stmt实际上是布尔值false而不是有效的PDOStatement对象。您对$stmt->bindParam()的调用失败,因为false不是对象,因此无法使用bindParam()方法。

在我看来,按值传递参数要比通过引用绑定变量容易得多。以下是错误检查和参数值的示例:

$pdo =  DBConnection::connect();

$sql = "INSERT INTO `tweets`( `tweet`, `tweeter_name`, `link`, `date`, `search_id`) 
    VALUES (:tweet, :tweeter_name, :link, :date, :search_id)";

if (($stmt = $pdo->prepare($sql)) === false) {
    die(print_r($pdo->errorInfo(), true));
}

$params = array(
    ':tweet'        => $tweet,
    ':tweeter_name' => $user,
    ':link'         => $link,
    ':date'         => $date,
    ':search_id'    => $search_id
);

if (($status = $stmt->execute($params) === false) {
    die(print_r($stmt->errorInfo(), true));
}

您在异常中看到的错误“列'tweeter_name'不能为空'”意味着您的tweeter_name列被声明为NOT NULL,但是当您将$ user变量绑定到以下内容时,它没有值: tweeter_name参数。