检查PDO查询以获取结果,然后重用数据

时间:2019-02-14 14:55:16

标签: php mysql pdo

我是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'];

这确实是我的主意……我认为某个地方有一个简单的解决方案,我只是看不到它。请帮忙!

3 个答案:

答案 0 :(得分:2)

$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。

答案 1 :(得分:0)

在使用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() );
}

答案 2 :(得分:0)

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