使用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
但它不......?!?
答案 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参数。