我是PDO的新手,我正在将应用程序从mysql_query升级到PDO。这肯定是一个愚蠢的问题 - 但我希望有人可以帮助我解决它。
我需要查看PDO查询是否有任何数据: - 如果没有,则抛出错误 - 如果有,则检索该数据
我可以使用mysql_num_rows轻松完成这项工作,但我们都知道这已被弃用了。
问题是,一旦我检查了是否有任何数据,我就无法再检索它。
检查运行正常,但是当试图检索实际结果时,它是空的。我当然可以在检查后再次执行查询 - 但我宁愿避免两次运行查询。
try
{
$result = $pdo2->prepare("SELECT first_name FROM users WHERE email = :email;");
$result->bindValue(':email', $email);
$result->execute();
$data = $result->fetchAll();
}
catch (PDOException $e)
{
$error = 'Error fetching user: ' . $e->getMessage();
echo $error;
exit();
}
if (!$data) {
echo "No data!";
} else {
echo "Data found!";
}
$row = $result->fetch();
echo "First name: " . $row['first_name'];
我怎么解决这个问题?我试图将$ result分配给另一个变量($ test = $ result),然后在$ test变量上运行数据检查 - 但即便如此,$ result变量STILL在运行检查后也不会返回任何数据(看到评论的行):
try
{
$result = $pdo2->prepare("SELECT first_name FROM users WHERE email = :email;");
$result->bindValue(':email', $email);
$result->execute();
$test = $result; // Duplicating the variable
$data = $test->fetchAll(); // Running the check on the duplicated variable
}
catch (PDOException $e)
{
$error = 'Error fetching user: ' . $e->getMessage();
echo $error;
exit();
}
if (!$data) {
echo "No data!";
} else {
echo "Data found!";
}
$row = $result->fetch(); // Still doesn't return the result!
echo "First name: " . $row['first_name'];
这真的是我的头脑......我认为在某个地方有一个简单的解决方案,我只是看不到它。请帮忙!
$result->fetch()
仅获取尚未获取的行。既然你用$result->fetchAll()
取得了所有东西,那就没有了。
如果你想要第一行,你可以使用:
$row = data[0];
如果要处理所有行,请使用:
foreach ($data as $row)
您可以使用rowCount()
方法而不是获取所有内容。
if (!$result->rowCount()) {
echo "No data";
} else {
echo "Data found!";
}
关于在PDO中使用rowCount()
和SELECT
查询有一些警告,但我认为它通常适用于MySQL。
当您使用try/catch
块时,您可以引发自己的异常以及捕获PDO抛出的异常 - 因此您可以执行以下操作:
try{
$sql='SELECT first_name FROM users WHERE email = :email;';
$stmt = $pdo2->prepare( $sql );
if( !$stmt )throw new Exception('Failed to prepare sql statement');
$result=$stmt->execute( array( ':email' => $email ) );
if( !$result )throw new Exception('Failed to get any results');
$rows = $stmt->rowCount();
if( $rows == 0 )throw new Exception('Empty recordset');
while( $rs=$stmt->fetch( PDO::FETCH_OBJ ) ){
echo $rs->firstname;
}
}catch ( PDOException $e ){
exit( 'Error fetching user: ' . $e->getMessage() );
}
您始终可以获取单个行,对于第一行,检查是否返回了数据,如果没有则进行处理。然后输入一个处理数据的do...while()
循环,然后在循环结束时读取下一行...
try
{
$result = $pdo2->prepare("SELECT first_name FROM users WHERE email = :email;");
$result->bindValue(':email', $email);
$result->execute();
$row = $result->fetch(); // Fetch first row of data
if (!$row) {
echo "No data!";
} else {
echo "Data found!";
do {
echo "First name: " . $row['first_name'];
}
while ($row = $result->fetch());
}
}
catch (PDOException $e)
{
$error = 'Error fetching user: ' . $e->getMessage();
echo $error;
exit();
}