Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
1

PDO prepare Не получается выборка из базы

02.05.2017, 16:33. Просмотров 1368. Ответов 12
Метки нет (Все метки)

Доброго времени суток!
Пытаюсь переделать запросы для защиты от sql инъекций, но ни чего в это не понимаю..
Помогите разобраться.. На мой взгляд , я вроде все правильно делаю но не работает, помогите кто знает.
Подключение к базе
PHP
1
2
3
4
5
$host = "localhost";
$db = "test";
$user = "test";
$pass = "";
$conn = new PDO("mysql:host=$host;dbname=$db",$user,$pass);
Вот эту выборку пытаюсь переделать
PHP
1
2
3
4
5
$sql = "SELECT * FROM controlt WHERE type_id=1";
$q = $conn->query($sql) or die("failed!");
while($r = $q->fetch(PDO::FETCH_ASSOC)){
  echo $r['kw']."<br/>";
}
Вот как делаю - но не работает
PHP
1
2
3
4
5
6
$sql = "SELECT * FROM controlt WHERE type_id=?";
$sql->execute(1);
$q = $conn->query($sql) or die("failed!");
while($r = $q->fetch(PDO::FETCH_ASSOC)){
  echo $r['kw']."<br/>";
}
Что не так почему не работает ?? Первая выборка работает, а вторая нет. Что я не так делаю??
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2017, 16:33
Ответы с готовыми решениями:

PDO и prepare по переменной
Добрый день, уже час бьюсь над проблемой и никак не могу решить, как получить значение из таблицы,...

Не работает PDO::prepare
Не заполняется таблица.Подскажите пожалуйста в чем беда??((Ошибку не выдает-просто пустая таблица и...

PDO bindValue и prepare
Всем привет. Никак не могу понять, в чем ошибка ... Не могу совместить prepare и bindValue. (...

PHP PDO PREPARE (ошибка SQLSTATE[42000])
$dbh = new PDO(..); $tableName = 'Name'; $outData = $dbh-&gt;prepare('SELECT * FROM :tableName...

12
Эксперт PHP
4082 / 3343 / 1434
Регистрация: 24.04.2014
Сообщений: 10,054
02.05.2017, 17:15 2
Лучший ответ Сообщение было отмечено DJestin как решение

Решение

PHP
1
2
$stmt = $pdo->prepare($sql);
$stmt->execute([1]);
die при ошибках делать не надо, это не mysqli; лучше при создании объекта pdo указывать выбрасывание экскпшенов при ошибках
1
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
03.05.2017, 14:17  [ТС] 3
Jewbacabra, Вот так вот нужно??
PHP
1
2
3
4
5
6
$sql = "SELECT * FROM control WHERE type_id= ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([1]);
while($r = $stmt->fetch(PDO::FETCH_ASSOC)){
  echo $r['kw']."<br/>";
}
Все равно не работает..

Добавлено через 2 минуты
Аа все, разобралась
в маем варианте нужно так $stmt = $conn->prepare($sql);
а не так $stmt = $pdo->prepare($sql);
Спасибо.

А можно еще вопрос, в чем отличия PDO от mysqli?? Что лучше использовать??
0
Эксперт PHP
4082 / 3343 / 1434
Регистрация: 24.04.2014
Сообщений: 10,054
03.05.2017, 15:59 4
mysqli работает только с субд mysql, pdo со многими субд. Что лучше одназначно сказать нельзя, мне больше нравится pdo
1
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
03.05.2017, 16:16  [ТС] 5
Jewbacabra, А не могли бы вы мне еще помочь вот такой вариант переделать
только нужно переделать из mysqli в PDO
mysqli
PHP
1
2
3
4
5
6
7
8
9
10
11
12
$query = ("SELECT * FROM add_table GROUP BY rows_id");
$result = mysqli_query($link, $query) or die("Error " . mysqli_error($link));
 while ($row = mysqli_fetch_array($result)){
    $query = ("SELECT * FROM control WHERE type_id=" . $row['type_id']);
    $result2 = mysqli_query($link, $query) or die("Error " . mysqli_error($link));
    $rows = mysqli_fetch_array($result2);
    if ($row['id_client'] == $id_client && $row['order_num'] == isset($_SESSION["order_num"])){
       echo $rows['kw'];
       echo $row['number'];
    }
 }
mysqli_close($link);
PDO
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$sql = "SELECT * FROM add_table  GROUP BY rows_id";
$rez = $pdo->query($sql) or die("failed!");
while($row = $rez->fetch(PDO::FETCH_ASSOC)){
  $type_id=$row['type_id'];
 
  $sql = "SELECT * FROM control WHERE type_id= ?";
  $stmt = $pdo->prepare($sql);
  $stmt->execute([$type_id]);
  $rows = $stmt->fetch(PDO::FETCH_ASSOC);
    if ($row['id_client'] == $id_client && $row['order_num'] == isset($_SESSION["order_num"])){
       echo $rows['kw'];
       echo $row['number'];
    }
 }
$stmt = null;
Пробую так делать но не получается..
0
Эксперт PHP
4082 / 3343 / 1434
Регистрация: 24.04.2014
Сообщений: 10,054
03.05.2017, 21:34 6
Цитата Сообщение от DJestin Посмотреть сообщение
Пробую так делать но не получается..
Нужно включить отображение всех ошибок, и
Цитата Сообщение от DJestin Посмотреть сообщение
$rez = $pdo->query($sql) or die("failed!");
die не надо тут использовать. При создании экземпляра класса PDO нужно установить выбрасывание исключений при ошибках
PHP
1
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
http://php.net/manual/ru/pdo.setattribute.php

Цитата Сообщение от DJestin Посмотреть сообщение
$rez = $pdo->query($sql) or die("failed!");
die не нужен.

Запросы к бд в цикле - это плохая практика. В цикле можно собирать запрос, но получать данные надо 1 запросом.

Цитата Сообщение от DJestin Посмотреть сообщение
$row['id_client'] == $id_client && $row['order_num'] == isset($_SESSION["order_num"])
Во-первых что за конструкция row['order_num'] == isset($_SESSION["order_num"]), а во-вторых почему это в php коде, а не запросе?

Использовать в запросах GROUP BY поля, не участвующие группировки - это ошибка. Mysql такое переварит, но результат может быть неожиданным, а в Postgresql будет ошибка.
0
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
04.05.2017, 11:23  [ТС] 7
Цитата Сообщение от Jewbacabra Посмотреть сообщение
При создании экземпляра класса PDO нужно установить выбрасывание исключений при ошибках
Вот, сделала такое подключение к базе, для выбрасываний исключений при ошибках такое подойдет?
PHP
1
2
3
4
5
6
7
8
9
10
11
$host = "localhost";
$db = "test";
$user = "test";
$pass = "";
$charset = 'utf8';
$opt = [
  PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
  PDO::ATTR_EMULATE_PREPARES   => false,
];
$pdo = new PDO("mysql:host=$host;dbname=$db;charset=$charset",$user,$pass,$opt);
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Запросы к бд в цикле - это плохая практика. В цикле можно собирать запрос, но получать данные надо 1 запросом.
А как мне сделать два запроса в одном?? Или мне просто второй запрос нужно поставить до while(в смысле while получается тут не нужен), как тогда мне все строки получить?

Добавлено через 3 минуты
Цитата Сообщение от Jewbacabra Посмотреть сообщение
die не нужен.
Как сделать этот запрос без die ??
PHP
1
2
3
$sql = "SELECT * FROM add_table ";
$rez = $pdo->query($sql) or die("failed!");
while($row = $rez->fetch(PDO::FETCH_ASSOC)){}
нужно как то так сделать?
PHP
1
2
3
$sql = "SELECT * FROM add_table ";
$rez = $pdo->query($sql);
while($row = $rez->fetch(PDO::FETCH_ASSOC)){}
0
Эксперт PHP
4198 / 3126 / 1012
Регистрация: 06.01.2011
Сообщений: 9,093
04.05.2017, 11:27 8
Цитата Сообщение от DJestin Посмотреть сообщение
нужно как то так сделать?
Да.
0
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
04.05.2017, 12:16  [ТС] 9
А как мне совместить 2 запроса??
Запрос 1
PHP
1
2
3
4
5
6
$sql = "SELECT * FROM add_table";
$rez = $pdo->query($sql);
while($row = $rez->fetch(PDO::FETCH_ASSOC)){
  echo $row['type_id']."<br/>";
}
$rez = null;
Запрос 2
PHP
1
2
3
4
5
6
7
$sql = "SELECT * FROM control WHERE type_id= ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$row['type_id']]); // Вот так же не правильно , и не работает
while($r = $stmt->fetch(PDO::FETCH_ASSOC)){
  echo $r['kw']."<br/>";
}
$stmt = null;
Мне нужно получит из таблицы add_table ид (type_id) , получаю их в первом запросе
Затем мне нужно по полученным type_id из первого запроса получит kw для каждого type_id из другой таблицы control
Как мне объединить эти 2 запроса??

Добавлено через 26 минут
Объединить 2 запроса , я имею в виду так же но не в цикле, так как было выше сказано что ..
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Запросы к бд в цикле - это плохая практика. В цикле можно собирать запрос, но получать данные надо 1 запросом.
PHP
1
2
3
4
5
6
7
8
9
$sql = "SELECT * FROM add_table";
$rez = $pdo->query($sql);
while($row = $rez->fetch(PDO::FETCH_ASSOC)){
  $sql = "SELECT * FROM control WHERE type_id= ?";
  $stmt = $pdo->prepare($sql);
  $stmt->execute([$row['type_id']]);
  $r = $stmt->fetch(PDO::FETCH_ASSOC);
  echo $r['type_id']."<br/>";
}
Как сделать этот запрос не в цикле??
0
Эксперт PHP
4198 / 3126 / 1012
Регистрация: 06.01.2011
Сообщений: 9,093
04.05.2017, 13:17 10
Лучший ответ Сообщение было отмечено DJestin как решение

Решение

Так?
SQL
1
SELECT kw FROM control JOIN add_table USING(type_id)
1
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
04.05.2017, 15:16  [ТС] 11
Para bellum, спасибо
А можно как то в этом запросе еще сделать отбор для add_table что бы выводил только для определенных id_client, order_num ?? Что бы мне убрать этот if
PHP
1
2
3
4
5
6
7
8
$sql = "SELECT * FROM control JOIN add_table USING(type_id)";
$rez = $pdo->query($sql);
while($row = $rez->fetch(PDO::FETCH_ASSOC)){
if ($row['id_client'] == $id_client && $row['order_num'] == isset($_SESSION["order_num"])){
       echo $row['kw']."<br/>";
       echo $row['number'];
    }
}
Я имею ввиду ( для add_table WHERE id_client = $id_client AND order_num = $_SESSION["order_num"] OR order_num = '0' ) вот такое можно как то прописать в этом запросе??
0
Эксперт PHP
4198 / 3126 / 1012
Регистрация: 06.01.2011
Сообщений: 9,093
04.05.2017, 15:51 12
Лучший ответ Сообщение было отмечено DJestin как решение

Решение

Да. Так и пропишите:
PHP
1
2
3
$stmt = $pdo->query("SELECT * FROM control JOIN add_table USING(type_id) WHERE id_client = ? AND order_num IN(0, ?)");
 
$rez = $stmt->execute([$id_client, $_SESSION["order_num"]]);
Добавлено через 2 минуты
Если поле id_client и/или order_num присутствует в обоих таблицах -- уточните, из какой таблицы их брать:
SQL
1
SELECT * FROM control c JOIN add_table a USING(type_id) WHERE a.id_client = ? AND a.order_num IN(0, ?)
1
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
04.05.2017, 16:35  [ТС] 13
Para bellum, Спасибо вам большое за помощь , это то что мне было нужно !
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.05.2017, 16:35

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

PDO::prepare для нескольких строк SQL
sql содержит несколько строк кода, можно их выполнить одним приемом, или нужно для каждой строки...

Выборка данных из БД класс PDO
Я только начал изучать PHP и никак все разобраться не могу. Не могу сообразить в чем моя ошибка. Я...

Выборка данных через PDO
Здравствуйте, уважаемые форумчане. Возникла такая вот проблема. Есть такой код. $_POST принимает...

PDO не получается вставить данные
Доброго времени суток, пытаюсь делать подготовленный запрос для добавления записи в базу, и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.