2014-10-01 3 views
2

Я пишу форму для входа php, и я хотел бы использовать PDO для подключения к db и писать свои запросы. На самом деле я очень новичок в заявлениях PDO, но для того, чтобы избежать внедрения sql, я бы предпочел использовать его. Я ценю, если кто-то может любезно помочь мне переписать мой запрос с PDO?как написать этот запрос mysql с PDO

Это мой код:

$qry="SELECT * FROM member WHERE username='$username' AND password='$password'"; 
$result=mysql_query($qry); 

//Check whether the query was successful or not 
if($result) { 
    if(mysql_num_rows($result) > 0) { 
     //Login Successful 
     session_regenerate_id(); 
     $member = mysql_fetch_assoc($result); 
     $_SESSION['SESS_MEMBER_ID'] = $member['mem_id']; 
     $_SESSION['SESS_FIRST_NAME'] = $member['username']; 
     $_SESSION['SESS_LAST_NAME'] = $member['password']; 
     session_write_close(); 
     header("location: home.php"); 
     exit(); 
    }else { 
     //Login failed 
     $errmsg_arr[] = 'user name and password not found'; 
     $errflag = true; 
     if($errflag) { 
      $_SESSION['ERRMSG_ARR'] = $errmsg_arr; 
      session_write_close(); 
      header("location: index.php"); 
      exit(); 
     } 
    } 
}else { 
    die("Query failed"); 
} 

Я попытался

$stmt = $conn->prepare("SELECT * FROM member WHERE username = :username and password = :password");` 

и

$stmt->execute(array(':username' => $username, ':password' => $password));` 

, но я не знаю, как я могу переписать часть, связанную с «проверить, запрос был успешным »

+0

Вы действительно объявили тип соединения PDO? – iamgory

+0

Да, я объявил PDO-соединение. Теперь это работает! Спасибо за ваше время ans support :) – mOna

ответ

2

Try -

$stmt = $conn->prepare("SELECT * FROM member WHERE username = :username and password = :password"); 
$stmt->bindValue(':username', $username); 
$stmt->bindValue(':password', $password); 
$stmt->execute(); 
$result = $stmt->fetch(PDO::FETCH_OBJ); 

if (!empty($result)) { 

    # Login Successful  
    $_SESSION['SESS_MEMBER_ID'] = $result->mem_id; 
    $_SESSION['SESS_FIRST_NAME'] = $result->username; 
    $_SESSION['SESS_LAST_NAME'] = $result->password; 

    header("location: home.php"); 

} else { 

    # Login failed 
    $errmsg_arr[] = 'user name and password not found'; 
    $errflag = true; 

     if($errflag) { 
     $_SESSION['ERRMSG_ARR'] = $errmsg_arr; 
     header("location: index.php"); 
     } 

} 

Обратите внимание, что для добавления, обновления, удаления и т.д. Вы можете использовать $count = $stmt->rowCount(); затем if ($count > 0) но пока это Безразлично Не выполняйте надежно с SELECT

+0

спасибо за помощь yr, я попробовал ваше решение, но когда я вставляю пользователя и передаю его, перезагрузите страницу входа снова (вместо перенаправления на home.php), я думаю, что, может быть, мне придется изменить и линию, связанную с этой частью! У тебя есть идея? – mOna

+0

Я думаю, что проблема в этой строке: $ member = mysql_fetch_assoc ($ result); – mOna

+0

Изменен мой ответ, как вам кажется немного запутанным - больше не нужно mysql_fetch_assoc. Также удалены ваши 'session_regenerate_id' и' session_write_close', поскольку они не нужны для простых сценариев входа. – iamgory

2

Вы можете просто использовать rowCount() в этом случае, чтобы проверить:

$stmt = $conn->prepare("SELECT * FROM member WHERE username = :username and password = :password"); 
$stmt->execute(array(':username'=>$username,':password'=>$password)); 
if($stmt->rowCount() > 0) { 
    // then select row has round rows 
    $member = $stmt->fetch(PDO::FETCH_ASSOC); 
    session_regenerate_id(); 
    $_SESSION['SESS_MEMBER_ID'] = $member['mem_id']; 
    $_SESSION['SESS_FIRST_NAME'] = $member['username']; 
    $_SESSION['SESS_LAST_NAME'] = $member['password']; 
    session_write_close(); 
    header("location: home.php"); 
    exit(); 

} 
+1

Это не рекомендуется, если вы проверите руководство по PHP - 'Если последний оператор SQL, выполняемый связанным с ним PDOStatement, был оператором SELECT, некоторые базы данных могут возвращать количество строк, возвращаемых этим оператором , Однако это поведение не гарантируется для всех баз данных и не должно полагаться на переносные приложения. ' – iamgory

+0

@ghost: Я пробовал решение iamgory, но когда я вставляю пользователя и пароль, он снова загружает страницу входа в систему! и это php nnotice, который я получаю в error.log: ** Неопределенный индекс: mem_id в /var/www/login_exec.php в строке 67, referer: http: //localhost/index.php** и одно и то же уведомление для имени пользователя и пароль .. у вас есть идеи? – mOna

+0

@mOna скорее всего, что ошибка показана из-за флага 'PDO :: FETCH_OBJ', после его набора вам нужно вызывать каждую строку по своим свойствам, так как она извлекает объекты вместо массивов – Ghost

Смежные вопросы