У меня есть система входа в систему, изначально я проверяю правильность комбинации имени пользователя и пароля, а затем выборка столбцов для установки переменных сеанса
Вот мой код
$sql='select uid,name from users where username=? and password=?'; $query=$con->prepare($sql); $result=$query->execute(array($username,$password)); $query->setFetchMode(PDO::FETCH_ASSOC); //check if a single row is returned if(($query->fetchColumn())===1) { //set session variables header('Location: lading_page.php'); } else echo "Invalid username/password";
1) fetchColumn()
дает неправильный результат как 3 (хотя у меня есть одна строка, соответствующая этим параметрам и 15 coulmns на строку), тогда как если бы $sql
был
$sql='select count(*) from users where username=? and password=?';
дает правильный ответ как 1 Почему?
2) Я увидел руководство по php, и я обнаружил, что rowCount()
поддерживается только для запросов DML, и он предлагает обходное решение для SELECT, но оно стоит 2 запроса для входа.
Есть ли способ, который я могу сделать, используя один запрос?
РЕДАКТИРОВАТЬ
Теперь я использую что-то вроде этого, и кажется, что он работает нормально, но мало проблем.
$sql='select uid,name from users where username=? and password=?'; $query=$con->prepare($sql); $result=$query->execute(array($username,$password)); $rows= $query->fetchAll(PDO::FETCH_ASSOC); if(count($rows)===1) { //I reached here echo $_SESSION['id']=$rows['uid']; //undefined index uid echo $_SESSION['name']=$rows['name'];//undefined index name //header('Location: landing_page.php'); } else $error="Invalid username/password";
надеюсь, я понял, что ты прав.
попробуйте с помощью Fetch all
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
в твоем случае
$sql='select uid,name from users where username=? and password=?'; $query=$con->prepare($sql); $result=$query->execute(array($username,$password)); // check if a single row is returned // i guess to avoid the warnings you can just set the array befor like // $row = array(); // or put @ befor the VARS in the TRUE statement $rows = $query->fetchAll(PDO::FETCH_ASSOC)); /** if you have more than one result you can look at them like this foreach ($rows as $row) { echo $row['uid']; } **/ if((count($rows)===1) { echo $_SESSION['id']=@$rows['uid']; echo $_SESSION['name']=@$rows['name']; // header('Location: lading_page.php'); } else echo "Invalid username/password";
fetchColumn () – возвращает один столбец из следующей строки результирующего набора. Это не число результирующих строк, как в «select count (*) …», это значение (в вашем случае) первого столбца (uid) в строке результата.