2012-11-19 113 views
0

與PDO準備statment將數據插入到數據庫中,我不工作:將數據插入數據庫PDO準備statment

我用這個函數:

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

UPDATE Also..see這裏:

我做同樣的事情用不同的query..but當我嘗試把對象屬性放在一個變量中我得到一個錯誤:

$ tweet = $ tweet-> tweet; $ user = $ tweet-> tweeter_name; $ link = $ tweet-> 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); 

我得到這樣的錯誤:

Notice: Trying to get property of non-object in C:\xampp\htdocs\Twitter\demo.php on line 36

注意:試圖讓用C非對象的屬性:\ XAMPP \ htdocs中\微博\ demo.php上線37

說明:試圖獲得非對象的屬性在C:\ XAMPP \ htdocs中\微\上線demo.php 38

它們分配給上述錯誤的綁定variables..the時,我可以打印properties..but冒出

我得到這個也:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'tweeter_name' cannot be null' in C:\xampp\htdocs\Twitter\demo.php:40 Stack trace: #0 C:\xampp\htdocs\Twitter\demo.php(40): PDOStatement->execute() #1 {main} thrown in C:\xampp\htdocs\Twitter\demo.php on line 40

我檢查,而不是像這樣:

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

它的工作原因是它討厭那些對象屬性?!?

這應該作爲輸入:

RT @OrganicLiveFood: Scientists Warn #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: Scientists Warn #EPA Over #Monsanto's #GMO Crop Failures & Dangers #prop37 #labelGMO #yeson37 http://t.co/2XhuVxO8

但它不...?!?

+2

你是否嘗試初始化你試圖綁定的變量?例如。 '$ word = 0;',就這樣存在PDO綁定的引用。 – fimas

回答

1

在連接後立即添加self::$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

它會確保PDO在每個錯誤上拋出PDOExceptions,使它們非常容易看到。然後,錯誤將概括出確切的錯誤。

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參數時沒有值。

+0

PDO異常很少(語法錯誤等)。您不應該在INSERT查詢中發生異常。如果您真的想要小心,請在生產時註釋PDO :: ERRMODE_EXCEPTION行。 –

+0

請參閱更新 –