Получение числа строк и данных этой строки в одном запросе с использованием PDO в PHP

У меня есть система входа в систему, изначально я проверяю правильность комбинации имени пользователя и пароля, а затем выборка столбцов для установки переменных сеанса

Вот мой код

$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"; 

Solutions Collecting From Web of "Получение числа строк и данных этой строки в одном запросе с использованием PDO в PHP"

надеюсь, я понял, что ты прав.

попробуйте с помощью 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) в строке результата.