try {
$db = new PDO("mysql:host=".HOST.";dbname=".DB, USER, PW);
$st = $db->prepare("SELECT * FROM c6ode");
}
catch (PDOException $e){
echo $e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)
在上述情况下如何检查查询的mysql错误?
我似乎无法从PDO收到任何错误消息:
#$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
try {
$sth = $dbh->prepare('@$%T$!!!');
print_r($sth);
print_r($dbh->errorInfo());
} catch (PDOException $e) {
echo $e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)
它只给出:
PDOStatement Object
(
[queryString] => @$%T$!!!
)
Array
(
[0] => 00000
[1] =>
[2] =>
)
Run Code Online (Sandbox Code Playgroud)
setAttribute没有任何帮助.
这是PHP 5.3.3
支持MySQL的Apache 2.0 Handler PDO驱动程序
客户端API版本mysqlnd 5.0.7-dev - 091210 - $ Revision:300533 $
我该怎么做才能获得错误信息?
这是我的代码片段:
$qry = '
INSERT INTO non-existant-table (id, score)
SELECT id, 40
FROM another-non-existant-table
WHERE description LIKE "%:search_string%"
AND available = "yes"
ON DUPLICATE KEY UPDATE score = score + 40
';
$sth = $this->pdo->prepare($qry);
$sth->execute($data);
print_r($this->pdo->errorInfo());
Run Code Online (Sandbox Code Playgroud)
这应该给我一个错误,因为表甚至不存在.我得到的只是:
数组([0] => 00000)
如何更好地描述错误,以便我可以调试问题?
如果发生错误,我总是希望PDO抛出异常,因为我总是像这样使用PDO:
try {
$dbh = new PDO("mysql:host=$kdbhost;dbname=$kdbname",$kdbuser,$kdbpw);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// some queries
}
catch (PDOException $e) {
error_log('PDO Exception: '.$e->getMessage());
die('PDO says no.');
}
Run Code Online (Sandbox Code Playgroud)
如果有一个我可以编辑的配置文件就可以了,那么默认情况下PDO会抛出异常 - 这可能吗?
我想要这个的原因是我每次都不必写这行:
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Run Code Online (Sandbox Code Playgroud)
更新 - 我已经创建了一个库来处理数据库访问(包括设置PDO以引发异常).
任何人都可以解释原因
$sql->execute($params);
Run Code Online (Sandbox Code Playgroud)
返回FALSE,而
print $pdo->errorCode();
print_r($pdo->errorInfo());
Run Code Online (Sandbox Code Playgroud)
两者都归还SQLSTATE 00000,这意味着根据文件的成功?它是一个INSERT,实际上没有任何东西被插入到数据库中...所以,为什么我会从中获得成功消息SQLSTATE?
如果它有帮助,这是代码......
$sql = $pdo->prepare("
INSERT INTO user (
username, fname, pass, salt, email,
loc_id_home, country_id_home, region_id_home,
cont_id_home, timestamp_reg, timestamp_upd, timestamp_lastonline,
online_status, gender, birthdate
)
VALUES (
:username,:fname,:pass,:random_salt,:email,
:loc_id_home,:country_id_home,:region_id_home,
:cont_id_home,'".time()."','".time()."','".time()."',
1,:gender,:birthdate)
");
$params=array(
':username'=>$username,
':fname'=>$fname,
':pass'=>$pass,
':random_salt'=>$random_salt,
':email'=>$email,
':loc_id_home'=>$loc_id_home,
':country_id_home'=>$country,
':region_id_home'=>$region,
':cont_id_home'=>$continent,
':gender'=>$gender,
':birthdate'=>$birthdate
);
$sql->execute($params);
print $pdo->errorCode();
print_r($pdo->errorInfo());
Run Code Online (Sandbox Code Playgroud) 我现在真的不知道该怎么做,我已经盯着它好几个小时了,并且要求它......我无法让它起作用!
require_once("Abstracts/DBManager.php");
require_once("UI/UI.Package.php");
class BlogDBM extends DBManager
{
private $table = "blog_records";
function saveRecord($title,$url,$desc,$feedId,$pubDate)
{
$PDO = $this->db->connect();
try
{
$query = $PDO->prepare("
INSERT INTO ".$this->table."
(title,url,desc,feed_id,pubdate) VALUES
(:title,:url,:desc,:feed_id,:pubdate)");
$query->bindParam(":title", $title);
$query->bindParam(":url", $url);
$query->bindParam(":desc", $desc);
$query->bindParam(":feed_id", $feedId, PDO::PARAM_INT);
$query->bindParam(":pubdate", $pubDate, PDO::PARAM_INT);
$query->execute();
//return $PDO->lastInsertId();
} catch(PDOException $e)
{
echo "Error " . $e->getMessage();
}
$PDO = NULL;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用PDOPHP 上的类,但我找到正确的方法来处理错误,我写了这段代码:
<?php
// $connection alreay created on a class which works with similar UPDATE statements
// I've simply added here trim() and PDO::PARAM... data type
$id = 33;
$name = "Mario Bros.";
$url = "http://nintendo.com";
$country = "jp";
try {
$sql = "UPDATE table_users SET name = :name, url = :url, country = :country WHERE user_id = :user_id";
$statement = $connection->prepare ($sql);
$statement->bindParam (':user_id', trim($id), PDO::PARAM_INT);
$statement->bindParam (':name', trim($name), PDO::PARAM_STR);
$statement->bindParam (':url', trim($url), PDO::PARAM_STR);
$statement->bindParam (':country', trim($country), …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用PDO预处理语句为MySQL数据库上的查询创建正确的错误处理.我希望程序在检测到预准备语句进程中的错误时退出.利用PDO准备好的声明过程中的每一步都False失败的事实,我把这个令人反感的黑客扔到了一起:
global $allFields;
global $db;
global $app;
//dynamically append all relevant fields to query using $allFields global
$selectQuery = 'SELECT ' . implode($allFields, ', ') .
' FROM People WHERE ' . $fieldName . ' = :value';
//prepared statement -- returns boolean false if failure running query; run success check
$success = $selectQueryResult = $db->prepare($selectQuery);
checkSuccess($success);
$success = $selectQueryResult->bindParam(':value', $fieldValue, PDO::PARAM_STR);
checkSuccess($success);
$success = $selectQueryResult->execute();
checkSuccess($success);
Run Code Online (Sandbox Code Playgroud)
与checkSuccess()执行以下操作:
function checkSuccess($success) {
if ($success == false) {
//TODO: …Run Code Online (Sandbox Code Playgroud) 仍然试图让我的头围绕pdo.
我有一个用pdo执行的insert语句.插入效果很好但是如果有错误我希望它显示给用户.
我有下面的try catch块.
try{
$insertuser = $db->prepare('INSERT INTO `she_she`.`Persons` (`idnumber`,`addedby`,`firstname`, `middlename`, `surname`, `fullname`, `gender`, `birthdate`, `homelanguage`, `department`, `employeetype`, `employeestatus`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)');
$insertuser->execute(array($idnumber,$user,$firstname, $middlename, $surname, $fullname, $gender, $birthdate, $language, $department, $employmenttype, $personstatus));
}
catch(PDOException $exception){
return $exception;
}
Run Code Online (Sandbox Code Playgroud)
如果查询失败,或者说重复的IDNumber,我希望将其显示给用户.
如果我只是尝试回显变量$ exception它就不起作用.
我想将mysql错误返回给用户.
任何建议一如既往地赞赏.
谢谢,瑞恩
UPDATE
根据提议的答案的新代码:
try{
$insertuser = $db->prepare('INSERT INTO `she_she`.`Persons` (`idnumber`,`addedby`,`firstname`, `middlename`, `surname`, `fullname`, `gender`, `birthdate`, `homelanguage`, `department`, `employeetype`, `employeestatus`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)');
$insertuser->execute(array($idnumber,$user,$firstname, $middlename, $surname, $fullname, $gender, $birthdate, $language, $department, $employmenttype, $personstatus));
}
catch(PDOException $exception){
return $exception->getMessage();
} …Run Code Online (Sandbox Code Playgroud) 我收到此错误:
致命错误:在第34行的C:\ xampp\htdocs\repo\generator\model\database.php中调用boolean上的成员函数fetch()
当我运行此代码时:
class database
{
private $user = 'root';
private $pass = '';
public $pdo;
public function connect() {
try {
$this->pdo = new PDO('mysql:host=localhost; dbname=generatordatabase', $this->user, $this->pass);
echo 'Po??czenie nawi?zane!';
}
catch(PDOException $e) {
echo 'Po??czenie nie mog?o zosta? utworzone: ' . $e->getMessage();
}
}
public function createTable() {
$q = $this->pdo -> query('SELECT * FROM article');
while($row = $q->fetch()) {
echo $row['id'].' ';
}
$q->closeCursor();
}
}
?>
Run Code Online (Sandbox Code Playgroud)