Странности PDO

Статус
В этой теме нельзя размещать новые ответы.

LoneSimba

Нубило-всея-планеты
Привет всем формучанам. Когда-то уже писал сюда свой говнокод, тогда меня избили ссаными тряпками. Сейчас с MySql перешел на PDO, но встретился со следующей белибердой: при запросе через prepare\execute запрос возвращает пустой результат, а если через query - то стандартная выбока sql. Вот собсвтенно, как я это пишу:
Код:
class Database
{
private $db;
private $select_users;
private $error;


/**
* Database constructor
* @param $host Host address
* @param $db Database name
* @param $user Username
* @param $pass User password
*/
public function __construct($host, $db, $user, $pass)
{
try {
$this->db = new PDO('mysql:host='.$host.';dbname='.$db .';charset=utf8', $user, $pass, array(PDO::ATTR_PERSISTENT => true));
$this->prepare_query();
$this->db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
} catch(PDOException $e) {
print "Error: " . $e->getMessage() . "<br>";
die();
}
}

/**
* Database prepare_query
* Выполняет подготовку запросов
*/
private function prepare_query()
{

$this->select_users = $this->db->prepare("SELECT * FROM `users` WHERE ?"); //param1 - критерии;

}


public function login($login,$passw) {

if($login == "") {
echo "<p class='error'>Поле логин не заполнено!</p><br> <p><a href='#' onclick='showLoginField();'>Назад</a></p>";
$this->error = 1;
} else if(!preg_match('/[a-zA-Z0-9]/',$login)) {
echo "<p class='error'>Можно использовать только латинские буквы и цифры</p><br> <p><a href='#' onclick='showLoginField();'>Назад</a></p>";
$this->error = 1;
}
if($this->error == 0) {
$par = "login='Test'";
$this->select_users->execute([$par]);

$this->select_users->debugDumpParams();

$fetch = $this->select_users->fetchAll();
var_dump($fetch);

$passw = md5($passw);
if($passw != $fetch['password']) {
echo "<p class='error'>Введен неверный пароль!</p><br> <p><a href='#' onclick='showLoginField();'>Назад</a></p>";
return;
}
echo "Вход удачен!";

}
}

}
приведенное возвращает такое:
SQL: [29] SELECT * FROM `users` WHERE ? Params: 1 Key: Position #0: paramno=0 name=[0] "" is_param=1 param_type=2 array(0) { }
Notice: Undefined index: password in C:\xampp\htdocs\www\func\database.class.php on line 133

Введен неверный пароль!


Назад
если же через обычный query -
SQL: [29] SELECT * FROM `users` WHERE ? Params: 1 Key: Position #0: paramno=0 name=[0] "" is_param=1 param_type=2 array(1) { [0]=> array(28) { ["user_id"]=> string(1) "1" [0]=> string(1) "1" ["login"]=> string(4) "Test" [1]=> string(4) "Test" ["name"]=> string(4) "Test" [2]=> string(4) "Test" ["mail"]=> string(10) "[email protected]" [3]=> string(10) "[email protected]" ["password"]=> string(32) "0cbc6611f5540bd0809a388dc95a615b" [4]=> string(32) "0cbc6611f5540bd0809a388dc95a615b" ["style_id"]=> string(7) "default" [5]=> string(7) "default" ["group_id"]=> string(4) "user" [6]=> string(4) "user" ["birthdate"]=> string(10) "2003-12-31" [7]=> string(10) "2003-12-31" ["regdate"]=> string(19) "2003-12-31 01:02:03" [8]=> string(19) "2003-12-31 01:02:03" ["lastin"]=> string(19) "2003-12-31 01:02:03" [9]=> string(19) "2003-12-31 01:02:03" ["avatar"]=> string(7) "default" [10]=> string(7) "default" ["banned"]=> string(1) "0" [11]=> string(1) "0" ["confirmed"]=> string(1) "1" [12]=> string(1) "1" ["cipher"]=> string(19) "2003-12-31 01:02:03" [13]=> string(19) "2003-12-31 01:02:03" } }
Notice: Undefined index: password in C:\xampp\htdocs\www\func\database.class.php on line 134

Введен неверный пароль!


Назад
 
Последнее редактирование модератором:

fixxxer

К.О.
Партнер клуба
$this->db->prepare("SELECT * FROM `users` WHERE ?");
Это ерунда.

Ты так и не понял, зачем нужны prepared statements и как с ними работать.

Плейсхолдеры ставятся там, где будет значение переменной, а не где попало.
Пример:
PHP:
$stmt = $db->prepare("SELECT * FROM `users` WHERE email = ? AND password = ?");
$stmt->execute([$email, $password]);
Читай внимательно тут:
http://phpfaq.ru/pdo
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
В Штатах на коробке для бензопилы есть надпись "не останавливайте руками". Как-раз этот случай
 

LoneSimba

Нубило-всея-планеты
Это ерунда.

Ты так и не понял, зачем нужны prepared statements и как с ними работать.

Плейсхолдеры ставятся там, где будет значение переменной, а не где попало.
Пример:
PHP:
$stmt = $db->prepare("SELECT * FROM `users` WHERE email = ? AND password = ?");
$stmt->execute([$email, $password]);
Читай внимательно тут:
http://phpfaq.ru/pdo
Я написал как раз то, что хотел. Это было для того, чтобы не 100500 запросов готовить для каждого столбца, а чтобы запрашивать любой where. хотя, если это PDO не обрабатывается, придется изменить. Тогда у меня появляются очередные вопросы к гибкости этого метода.
 

Вурдалак

Продвинутый новичок
Это было для того, чтобы не 100500 запросов готовить для каждого столбца, а чтобы запрашивать любой where.
Выражение для WHERE — это SQL-код. А строковые литералы и числа — это данные. Ты не можешь в плейсхолдер подставить код, только данные.
 
  • Like
Реакции: AmdY

LoneSimba

Нубило-всея-планеты
Мда, я нубило как есть. Спасибо @fixxxer за помощь! Проблема была не только в том, что я SQL-код подставлял(спасибо @Вурдалак) в него, но и еще из-за слитого написания ...login='Test'. Видимо я многого не понимаю, если код ...login='Test' PMA пашет, а в запросе через PDO - нет.
 

LoneSimba

Нубило-всея-планеты
Тогда еще вопросец в догонку - что не так с индексом password? Ругается, что он не задан, хотя в результирующем массиве он есть.
 

LoneSimba

Нубило-всея-планеты
Понял, многомерный массив... чтож PDO так сложней чем MySQL?!
 

Фанат

oncle terrible
Команда форума
fetchAll() у тебя что возвращает? А обращаещься ты к нему как?
 

LoneSimba

Нубило-всея-планеты
"Дело было не в бобине..." - продолжение знаешь?
fetchAll() тебя фашисты под дулом автомата заставляли писать?
извините, трищ Фанат, не знаю. Совесткие фильмы не особо люблю. На момент написания кода я понятия не имел, как fetchAll работал. Увидел, что написано о выводе всех значений выборки. В мускуле то вариантов вроде не особо было
 

Фанат

oncle terrible
Команда форума
В мускуле то вариантов вроде не особо было
Советские фильмы не любишь, а рассуждаешь как совок, наличие разных возможностей тебя пугает бедняжку.
Скорее бы на пенсию да? Там вариантов немного, за кефирчиком в магазин и за денежкой в сберкакссу.
То-то жизнь вольготная.
 

Фанат

oncle terrible
Команда форума
В общем, с таким подходом, когда все вокруг тебе виноваты, а один ты в белом, ссаные тряпки будут твоими вечными спутниками.
 

LoneSimba

Нубило-всея-планеты
В общем, с таким подходом, когда все вокруг тебе виноваты, а один ты в белом, ссаные тряпки будут твоими вечными спутниками.
именно из-за неконструктивной критики я и невзлюбил этот форум. а то, что виноваты все, вокруг меня - лишь мой эгоцентризм. А с вариантами - когда писал код, разбираться времени не было. А фильмы я особо вообще не смотрю.
 

Фанат

oncle terrible
Команда форума
Дадад, и критика неконструктивная
Нимб не жмет? :)
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху