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

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

02.05.2017, 16:33. Показов 2025. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.05.2017, 16:33
Ответы с готовыми решениями:

PDO и prepare по переменной
Добрый день, уже час бьюсь над проблемой и никак не могу решить, как получить значение из таблицы, где поле login = $login ? &lt;?php...

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

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

12
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
02.05.2017, 17:15
Лучший ответ Сообщение было отмечено 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  [ТС]
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
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
03.05.2017, 15:59
mysqli работает только с субд mysql, pdo со многими субд. Что лучше одназначно сказать нельзя, мне больше нравится pdo
1
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
03.05.2017, 16:16  [ТС]
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
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
03.05.2017, 21:34
Цитата Сообщение от 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  [ТС]
Цитата Сообщение от 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
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
04.05.2017, 11:27
Цитата Сообщение от DJestin Посмотреть сообщение
нужно как то так сделать?
Да.
0
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
04.05.2017, 12:16  [ТС]
А как мне совместить 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
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
04.05.2017, 13:17
Лучший ответ Сообщение было отмечено 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  [ТС]
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
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
04.05.2017, 15:51
Лучший ответ Сообщение было отмечено 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  [ТС]
Para bellum, Спасибо вам большое за помощь , это то что мне было нужно !
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.05.2017, 16:35
Помогаю со студенческими работами здесь

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

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

Выборка данных из БД класс PDO
Я только начал изучать PHP и никак все разобраться не могу. Не могу сообразить в чем моя ошибка. Я подключаюсь к БД: try { $DBH =...

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru