Проверьте запрос PDO на результат и затем повторно используйте данные - PullRequest
0 голосов
/ 14 февраля 2019

Я новичок в 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 голосов
/ 14 февраля 2019

$result->fetch() выбирает только те строки, которые еще не были выбраны.Поскольку вы извлекли все с помощью $result->fetchAll(), ничего не осталось.

Если вы хотите первую строку, вы можете использовать:

$row = data[0];

Если вы хотите обработать все строки, используйте:

foreach ($data as $row)

Вместо извлечения всего можно использовать метод rowCount().

if (!$result->rowCount()) {
    echo "No data";
} else {
    echo "Data found!";
}

Существуют предостережения относительно использования rowCount() с SELECT запросами в PDO,но я думаю, что это обычно работает с MySQL.

0 голосов
/ 14 февраля 2019

Вы всегда можете выбрать отдельные строки и для первой строки проверить, возвращены ли данные, и обработать, если нет.Затем введите цикл 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();
}
0 голосов
/ 14 февраля 2019

Поскольку вы используете блок 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() );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...