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

问题描述 投票:1回答:3

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

这真的是我的头脑......我认为在某个地方有一个简单的解决方案,我只是看不到它。请帮忙!

php mysql pdo
3个回答
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。


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

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();
}
© www.soinside.com 2019 - 2024. All rights reserved.