Php 检查PDO查询结果,然后重用数据

Php 检查PDO查询结果,然后重用数据,php,mysql,pdo,Php,Mysql,Pdo,我是PDO新手,正在将一个应用程序从mysql_query升级到PDO。这的确是一个愚蠢的问题,但我希望有人能帮我解决这个问题 我需要查看PDO查询是否有任何数据: -如果没有,则抛出一个错误 -如果有,则检索该数据 我可以很容易地用mysql_num_行实现这一点,但众所周知,这是不推荐的 问题是,一旦我检查了是否有任何数据,我就无法再检索它 检查运行正常,但是当尝试检索实际结果时,它是空的。当然,我可以在检查后再次执行查询,但我宁愿不必运行两次查询 try { $result = $

我是PDO新手,正在将一个应用程序从mysql_query升级到PDO。这的确是一个愚蠢的问题,但我希望有人能帮我解决这个问题

我需要查看PDO查询是否有任何数据: -如果没有,则抛出一个错误 -如果有,则检索该数据

我可以很容易地用mysql_num_行实现这一点,但众所周知,这是不推荐的

问题是,一旦我检查了是否有任何数据,我就无法再检索它

检查运行正常,但是当尝试检索实际结果时,它是空的。当然,我可以在检查后再次执行查询,但我宁愿不必运行两次查询

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变量在运行检查后仍然不会返回任何数据(请参见注释行):


这真的让我头疼。。。我想有一个简单的解决办法,我就是看不出来。请帮忙

当您使用
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() );
}
$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。

您始终可以获取单独的行,对于第一行,检查是否返回了数据,如果没有返回,则进行处理。然后输入一个
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();
}

当您使用
fetchAll
时,您已经检索到了所有数据,因此当您尝试使用
fetch
时,没有什么可以检索的了
fetchAll
将是一个数组,其中可能包含一行或多行数据(因为您的查询没有将结果限制为一行)。您可能还需要使用
$data=$test->fetchAll(PDO::FETCH\u ASSOC):
。以便仅返回具有列名称的关联数组。有关更多信息,请参阅。仅供参考,您可以在执行调用中直接传递变量,并避免单独调用bind<代码>$result->execute([':email'=>$email])
mysql_num_rows()的PDO等价物是
$result->rowCount()
将对象分配给不同的变量不会产生副本,因此对一个变量所做的任何操作都会影响另一个变量。只复制数组,不复制对象。
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();
}