I have this function and it keeps giving out the error "Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error' in..." The error is directing me to the line "$row = $q2->fetchAll(PDO::FETCH_OBJ);". I've searched tonnes for a solution but to no avail. My code appears to be the same format as the examples given in the php docs...
我有这个函数,它不断给出错误的“致命错误:未捕获异常的PDOException”和message“SQLSTATE[HY000]:一般错误”。这个错误指示我“$row = $q2->fetchAll(PDO: FETCH_OBJ)”。我已经寻找了一种解决方案,但没有用。我的代码与php文档中给出的示例的格式相同……
Here's the function updated as per TML's suggestions:
以下是按照TML的建议更新的功能:
//gets a record by id and sets object properties to it's values
function getById($sid) {
global $conf, $pdo;
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//checks to see if a record exists for the given id
try {
$stmt = $pdo->prepare('Use ' . $conf['database'] . '; select mem_id as "_id", mem_name as "_name", mem_info as "_info",
mem_password as "_password", mem_email as "_email", mem_image as "_image",
mem_group as "_group"
from ' . $conf['prefix'] . 'members
where mem_id = ?;');
echo"85 <br />";
$stmt->execute(array($sid));
echo"86 <br />";
$rows = $stmt->fetchAll(PDO::FETCH_OBJ);
echo"90 <br />";
print_r($rows);
if (count($rows) !== 1) {
throw new Exception("Some exception here");
}
foreach($rows[0] as $field=>$value) {
$this->$field = $value;
echo"97 <br />";
}
} catch (PDOException $e) {
echo"something went wrong! " . var_dump($e);
}
}
var_dump output:
var_dump输出:
object(PDOException)[4]
protected 'message' => string 'SQLSTATE[HY000]: General error' (length=30)
private 'string' (Exception) => string '' (length=0)
protected 'code' => string 'HY000' (length=5)
protected 'file' => string 'D:\wamp\www\testing\scripts\Kantan\classes\Member.php' (length=53)
protected 'line' => int 86
private 'trace' (Exception) =>
array (size=2)
0 =>
array (size=6)
'file' => string 'D:\wamp\www\testing\scripts\Kantan\classes\Member.php' (length=53)
'line' => int 86
'function' => string 'fetchAll' (length=8)
'class' => string 'PDOStatement' (length=12)
'type' => string '->' (length=2)
'args' =>
array (size=1)
...
1 =>
array (size=6)
'file' => string 'D:\wamp\www\testing\scripts\Kantan\test.php' (length=43)
'line' => int 5
'function' => string 'getById' (length=7)
'class' => string 'Member' (length=6)
'type' => string '->' (length=2)
'args' =>
array (size=1)
...
private 'previous' (Exception) => null
public 'errorInfo' =>
array (size=1)
0 => string 'HY000' (length=5)
public 'xdebug_message' => string '<tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> PDOException: SQLSTATE[HY000]: General error in D:\wamp\www\testing\scripts\Kantan\classes\Member.php on line <i>86</i></th></tr>
<tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
<tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeee'... (length=1472)
Thanks in advance for any help.
谢谢你的帮助。
1 个解决方案
#1
1
A better way to write the code above - and one that will likely fix your problem - might look something like this:
一种更好的方法来编写上面的代码——并且可能解决您的问题——可能是这样的:
//gets a record by id and sets object properties to it's values
function getById($sid) {
global $conf, $pdo;
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//checks to see if a record exists for the given id
try {
$stmt = $pdo->prepare('select mem_id as "_id", mem_name as "_name", mem_info as "_info",
mem_password as "_password", mem_email as "_email", mem_image as "_image",
mem_group aS "_group"
from members
where mem_id = ?');
$stmt->execute(array($sid));
$rows = $stmt->fetchAll(PDO::FETCH_OBJ);
if (count($rows) !== 1) {
throw new Exception("Some exception here");
}
foreach($rows[0] as $field=>$value) {
$this->$field = $value;
}
} catch (PDOException $e) {
/* handle errors in useful way, don't just die() */
}
}
Some differences to note:
一些差异注意事项:
- There's doesn't appear to be any sane reason to query the database twice.
- 似乎没有任何合理的理由对数据库进行两次查询。
- Your code above ignores one of the main benefits of using prepared statements with PDO - namely, parameterization of your queries.
- 上面的代码忽略了使用PDO准备语句的主要好处之一,即查询的参数化。
- "or die()" leaves a terrible user experience - handle errors more gracefully. I used exception handling in my example here, but that's certainly not the only way to do it; I simply defaulted to that because of your setAttribute call.
- 或die()“留下糟糕的用户体验——更优雅地处理错误。在我的例子中,我使用了异常处理,但这肯定不是唯一的方法;我只是因为您的setAttribute调用而默认了它。
- Although I left your global variables intact here, you should really consider moving away from using 'global', as it is generally considered pretty poor practice. A little bit of Google work should turn up any number of articles discussing why, but the Law of Demeter is a good place to start.
- 虽然我在这里保留了您的全局变量,但是您应该考虑放弃使用“全局”,因为它通常被认为是非常糟糕的实践。一些谷歌的工作应该会出现一些讨论原因的文章,但是Demeter定律是一个很好的开始。
- There's no reason for all those 'USE ' calls; the PDO object will already carry that information for you.
- 没有理由使用这些电话;PDO对象将已经为您携带该信息。
The members of Freenode's ##PHP have put together a tutorial for PDO that you might want to check out before progressing too much further.
Freenode的##PHP的成员已经为PDO编写了一个教程,您可能希望在进一步深入之前检查一下。
#1
1
A better way to write the code above - and one that will likely fix your problem - might look something like this:
一种更好的方法来编写上面的代码——并且可能解决您的问题——可能是这样的:
//gets a record by id and sets object properties to it's values
function getById($sid) {
global $conf, $pdo;
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//checks to see if a record exists for the given id
try {
$stmt = $pdo->prepare('select mem_id as "_id", mem_name as "_name", mem_info as "_info",
mem_password as "_password", mem_email as "_email", mem_image as "_image",
mem_group aS "_group"
from members
where mem_id = ?');
$stmt->execute(array($sid));
$rows = $stmt->fetchAll(PDO::FETCH_OBJ);
if (count($rows) !== 1) {
throw new Exception("Some exception here");
}
foreach($rows[0] as $field=>$value) {
$this->$field = $value;
}
} catch (PDOException $e) {
/* handle errors in useful way, don't just die() */
}
}
Some differences to note:
一些差异注意事项:
- There's doesn't appear to be any sane reason to query the database twice.
- 似乎没有任何合理的理由对数据库进行两次查询。
- Your code above ignores one of the main benefits of using prepared statements with PDO - namely, parameterization of your queries.
- 上面的代码忽略了使用PDO准备语句的主要好处之一,即查询的参数化。
- "or die()" leaves a terrible user experience - handle errors more gracefully. I used exception handling in my example here, but that's certainly not the only way to do it; I simply defaulted to that because of your setAttribute call.
- 或die()“留下糟糕的用户体验——更优雅地处理错误。在我的例子中,我使用了异常处理,但这肯定不是唯一的方法;我只是因为您的setAttribute调用而默认了它。
- Although I left your global variables intact here, you should really consider moving away from using 'global', as it is generally considered pretty poor practice. A little bit of Google work should turn up any number of articles discussing why, but the Law of Demeter is a good place to start.
- 虽然我在这里保留了您的全局变量,但是您应该考虑放弃使用“全局”,因为它通常被认为是非常糟糕的实践。一些谷歌的工作应该会出现一些讨论原因的文章,但是Demeter定律是一个很好的开始。
- There's no reason for all those 'USE ' calls; the PDO object will already carry that information for you.
- 没有理由使用这些电话;PDO对象将已经为您携带该信息。
The members of Freenode's ##PHP have put together a tutorial for PDO that you might want to check out before progressing too much further.
Freenode的##PHP的成员已经为PDO编写了一个教程,您可能希望在进一步深入之前检查一下。