Я пытаюсь преобразовать старую библиотеку MySQL в PDO.

Чтобы читать данные с помощью моего старого кода MySQL, я использую:

$ assoc = mysql_fetch_assoc ($ exeqr);

С PDO я пытаюсь сделать это с помощью foreach, как в моем коде с использованием PDO, но он не работает ...

Вы видите здесь что-то не так ??

Моя СТАРАЯ ода с использованием MySQL:

<?php
if(isset($_POST['sendLogin']))
{
    $f['email'] = mysql_real_escape_string($_POST['email']);
    $f['pass'] = mysql_real_escape_string($_POST['password']);

    if(!$f['email'] || !valMail($f['email']))  
    {
      echo 'Email empty or invalid';
    }
    else if(strlen($f['pass']) <8 || strlen($f['pass'])>12)
    {
        echo 'pass must have between 8 and 12 chars!';
    }
    else
    {
        $autEmail = $f['email'];
        $autpass = $f['pass'];
        $query = "SELECT * FROM users where email= '$autEmail'";       
        $exeqr = mysql_query($query) or die(mysql_error());
        $assoc = mysql_fetch_assoc($exeqr);

        if(mysql_num_rows($exeqr) == 1 )
        {
            if($autEmail == $assoc['email'] && $autpass == $assoc['pass'])
            {
                $_SESSION['assoc'] = $assoc;
                header('Location:'.$_SERVER['PHP_SELF']);
            }
            else
            {
                echo ' wrong password';
            }
        }
        else
        {
            echo 'email does no exist';
        }
    }
}

И новый код, который я пытаюсь преобразовать с помощью PDO:

<?php
if(isset($_POST['sendLogin']))
{
    $f['email'] = mysql_real_escape_string($_POST['email']);
    $f['pass'] = mysql_real_escape_string($_POST['password']);

    if(!$f['email'] || !valMail($f['email']))  
    {
        echo 'Email empty or invalid';
    }
    else if(strlen($f['pass']) <8 || strlen($f['pass'])>12)
    {
        echo 'pass must have between 8 and 12 chars!';
    }
    else
    {
        $autEmail = $f['email'];
        $autpass = $f['pass'];
        $searchEmail = $pdo->prepare("SELECT * FROM users where email=:email");   
        $searchEmail->bindValue(":email,$autEmail");   
        $searchEmail->execute; 
        $num_rows = $searchEmail->fetchColumn();
       $result = $searchEmail->fetch(PDO::FETCH_OBJ);

        if($num_rows == 1)
        {
            if($autEmail == $result['email'] && $autpass == $result['pass'])
            {
                $_SESSION['result'] = $result;
                header('Location:'.$_SERVER['PHP_SELF']);
            }
            else
            {
                echo ' wrong password';
            }
        }
        else
        {
            echo 'email does no exist';
        }
    }
}
0
John23 28 Мар 2014 в 04:56

1 ответ

Лучший ответ

Предупреждение: PDOStatement :: bindValue () ожидает как минимум 2 параметра, 1 из которых указан в $ searchEmail-> bindValue (": email, $ autEmail");

Вам нужно переместить свой ", в настоящее время он включает переменную, а также имя параметра, в результате чего вы не передаете переменную для привязки к указанному параметру (вот почему вы получаете сообщение об ошибке, говорящее, что вы не передано достаточно аргументов).

$searchEmail = $pdo->prepare("SELECT * FROM users where email = :email");   
$searchEmail->bindValue(":email", $autEmail);

Примечание. Неопределенное свойство: PDOStatement :: $ execute в $ searchEmail-> execute;

Вы забыли скобки () в execute(), поэтому PHP ищет свойство класса PDO под названием execute вместо вызова функции.

$searchEmail->execute();

(спасибо Prix)

Изменить

Теперь ваш вопрос о том, как это заменить:

$assoc = mysql_fetch_assoc($exeqr);

... с эквивалентом PDO. В руководстве есть пример :

$assoc = $searchEmail->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP);

Примечание. fetchAll() предназначен для получения нескольких результатов. Если вы ожидаете только один результат (что может быть, но вы не ограничиваете свой запрос, поэтому можно вернуть несколько результатов), вам следует просто использовать fetch():

$assoc = $searchEmail->fetch(PDO::FETCH_ASSOC);
3
scrowler 28 Мар 2014 в 05:24
Спасибо! Но у меня все еще есть это: Примечание: свойство Undefined: PDOStatement :: $ execute в $ searchEmail-> execute;
 – 
John23
28 Мар 2014 в 05:03
Я думаю, это $ searchEmail-> execute ();
 – 
John23
28 Мар 2014 в 05:04
Спасибо, вы видите, правильный ли этот метод с foreach? Потому что у меня нет этих ошибок, но когда я ввожу правильный адрес электронной почты и пароль, появляется мое эхо «электронной почты не существует»;
 – 
John23
28 Мар 2014 в 05:09
Вам не нужны никакие циклы, так как вы хотите получить только один результат. $result = $searchEmail->fetch(PDO::FETCH_OBJ); echo $result->email, " - " $result->pass, "\n"; И вам следует избегать сохранения пароля в сеансе, если другой пользователь возьмет на себя этот сеанс, он сможет взять на себя этого пользователя, поэтому вы должны хранить пароль и запрашивать пароль в зависимости от серьезности действия, пользователь запрошен.
 – 
Prix
28 Мар 2014 в 05:10
Но мне нужно получить доступ к своим пользовательским полям, как я сделал с mysql_fectch_assoc ($ exeqr), поэтому я подумал, что с помощью foreach было хорошее решение, но оно не работает!
 – 
John23
28 Мар 2014 в 05:11