0

使用 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->tweet ; $user=$tweet->tweeter_name; $链接= $tweet->链接;

这些变量进入查询:

       $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]:完整性约束违规:C:\xampp\htdocs\Twitter\demo.php:40 中的 1048 列 'tweeter_name' 不能为空 堆栈跟踪:#0 C :\xampp\htdocs\Twitter\demo.php(40): PDOStatement->execute() #1 {main} 在第 40 行的 C:\xampp\htdocs\Twitter\demo.php 中抛出

我改为这样检查:

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

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

这应该作为输入:

RT @OrganicLiveFood:科学家警告#EPA Over #Monsanto's #GMO Crop Failures & Dangers #prop37 #labelGMO #yeson37 http://t.co/2XhuVxO8 Doumastic TweetCaster for iOS Mon, 19 Nov 2012 20:40:55 +0000 RT @ OrganicLiveFood:科学家就#Monsanto 的#GMO 作物歉收和危险警告#EPA #prop37 #labelGMO #yeson37 http://t.co/2XhuVxO8

但它不...?!?

4

2 回答 2

1

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

它将确保 PDO 将在每个错误上抛出 PDOExceptions,使它们很容易看到。然后,该错误将准确概述出了什么问题。

于 2012-11-19T20:13:55.513 回答
1

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

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


回复:你的更新。

您应该检查两者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));
}

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

于 2012-11-19T20:19:27.730 回答