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;
    }
}

更新 また..こちらを参照してください:

別のクエリで同じことを行います..しかし、変数内にオブジェクトのプロパティを入れようとすると、エラーが発生します:

$つぶやき= $つぶやき->つぶやき; $user=$tweet->tweeter_name; $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 の非オブジェクトのプロパティを取得しようとしています

プロパティを出力できます..しかし、それらをバインドされた変数に割り当てると..上記のエラーが発生します

私もこれを取得します:

致命的なエラー: C:\xampp\htdocs\Twitter\demo.php:40 のメッセージ「SQLSTATE[23000]: 整合性制約違反: 1048 列 'tweeter_name' を null にすることはできません」を含む例外 'PDOException' がキャッチされない: スタック トレース: #0 C :\xampp\htdocs\Twitter\demo.php(40): PDOStatement->execute() #1 {main} が C:\xampp\htdocs\Twitter\demo.php 行 40 でスローされました

代わりに次のようにチェックしました:

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

そしてそれはうまくいきました..何らかの理由で、それらのオブジェクトのプロパティが嫌いですか?!?

これは入力として行く必要があります:

RT @OrganicLiveFood: 科学者は #EPA について #Monsanto の #GMO 作物の失敗と危険性について警告 #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

からの戻り値を確認してください。$stmt->execute()問題があった場合は返されるので、詳細falseを確認する必要があります$stmt->errorInfo()

または、@ Madara Uchiha が提案する ERRMODE_EXCEPTION を使用しますが、アプリケーションで例外をまだ処理していない場合、これに適応するのは難しい場合があります。


Re: あなたの更新。

呼び出すたびに、両方PDO::prepare()からエラー ステータスを確認する必要があります。PDOStatement::execute()「オブジェクト以外のプロパティを取得しようとしています」に関するエラーは、有効な PDOStatement オブジェクトではなく、$stmt実際にはブール値であることを意味する可能性があります。falseへの呼び出しはオブジェクトではない$stmt->bindParam()ため失敗するため、メソッドを持つことはできません。falsebindParam()

私の意見では、参照によって変数をバインドするよりも、値によってパラメーターを渡す方がはるかに簡単です。エラーチェックと値によるパラメータの例を次に示します。

$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 に答える