Коллеги, подскажите pls, что я делаю не так... Я осваиваю работу с базой данных. Хочу научиться правильно читать ее содержимое и удобно работать с ним. У меня есть тестовая база. В ней содержится пользователи и пароли, но вполне могли бы породы кошек и их расцветки или авторы и их книжки. Код (Text): CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(255), password VARCHAR(255), comment VARCHAR(255) ); INSERT INTO users (username,password,comment) VALUES ('admin','','Default Admin'); INSERT INTO users (username,password,comment) VALUES ('admin1','Jgw4LNVekL8jEjq5dU','Admin №1'); INSERT INTO users (username,password,comment) VALUES ('admin2','UKCMLTS073cq26iIOc','Admin №2'); INSERT INTO users (username,password,comment) VALUES ('admin3','oU1Qky27TzmFOGFj4c2I','Admin №3'); INSERT INTO users (username,password,comment) VALUES ('admin4','JSfkWJWjT6rdI5cgHo','Admin №4'); INSERT INTO users (username,password,comment) VALUES ('admin5','HLTmJCnzxm2DW6LT9','Admin №5'); Я соединяюсь с базой и читаю её. PHP: $dsn = 'mysql:dbname='.$config['db_name'].';host='.$config['db_host']; $pdo = new PDO($dsn, $config['db_user'], $config['db_pass']); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sth = $pdo->prepare("SELECT * FROM `users`;"); $sth->execute(); $data = $sth->fetchAll(PDO::FETCH_UNIQUE); $result = print_r($data, true); echo $result; Получаю выдачу: Array ( [1] => Array ( [username] => admin [1] => admin [password] => [2] => [comment] => Default Admin [3] => Default Admin ) [2] => Array ( [username] => admin1 [1] => admin1 [password] => Jgw4LNVekL8jEjq5dU [2] => Jgw4LNVekL8jEjq5dU [comment] => Admin №1 [3] => Admin №1 ) [3] => Array ( [username] => admin2 [1] => admin2 [password] => UKCMLTS073cq26iIOc [2] => UKCMLTS073cq26iIOc [comment] => Admin №2 [3] => Admin №2 ) [4] => Array ( [username] => admin3 [1] => admin3 [password] => oU1Qky27TzmFOGFj4c2I [2] => oU1Qky27TzmFOGFj4c2I [comment] => Admin №3 [3] => Admin №3 ) [5] => Array ( [username] => admin4 [1] => admin4 [password] => JSfkWJWjT6rdI5cgHo [2] => JSfkWJWjT6rdI5cgHo [comment] => Admin №4 [3] => Admin №4 ) [6] => Array ( [username] => admin5 [1] => admin5 [password] => HLTmJCnzxm2DW6LT9 [2] => HLTmJCnzxm2DW6LT9 [comment] => Admin №5 [3] => Admin №5 ) ) Далее, я хочу воспользоваться маленькими, но приятными удобствами, и меняю код. PHP: $my_cols = 'username,password,comment'; $sth = $pdo->prepare("SELECT :cols FROM `users`;"); $sth->bindParam(':cols', $my_cols); $sth->execute(); $data = $sth->fetchAll(PDO::FETCH_UNIQUE); В ответ получаю вот что: Array ( [username,password,comment] => Array ( ) ) По идее, он даже подстановку раскрыл, но ничего не получил. Как мне адресовывать структуры в $data для поштучного просмотра и почему во втором случае массив пуст? Признателен за рекомендации, Ogogon.
Ты препарируешь единственное число значения, и я впервые вижу чтобы так названия столбцов пытались кастомизировать. Зачем тебе подготовленные запросы когда значения не совсем те потребляешь? твой единственный столбец по требованию называется "username,password,comment" --- Добавлено --- Юзай query на данный момент
Добрый день! Имена таблиц и столбцов нельзя заменять параметрами в PDO. Попробуйте сделать так PHP: $my_cols = 'username,password,comment'; $sth = $pdo->prepare("SELECT $my_cols FROM `users`;"); $sth->execute(); $data = $sth->fetchAll(PDO::FETCH_UNIQUE); Удачи!
Благодарю. Я сделал вот так: PHP: $data = $pdo->query("SELECT $my_cols FROM `users`;")->fetchAll(PDO::FETCH_UNIQUE); А как мне обращаться к элементам массива $data? Например, как вывести вторую колонку третьей полученной строки? $data[3][2] дает ошибку. Или как посчитать количество колонок в четвертой строке?
Добрый день! Попробую объснить не больно. 1. Чтобы узнать как обращаться к элементам массива $data нужно добавить var_dump($data) и Вы увидете структуру данных. Возможно, что ошибка на $data[3][2] происходит из-за того, что массив $data нет и запрос возвращает false. 2. Про "без лимитов такое себе". Такие заппросы на больших таблицах могут работать медленно. Поэтому в них добавляют параметр LIMIT позвлящий выбирать данные порциями. Например, если в Ваш запрос добавить LIMIT 30 OFFSET 1, то будут выбираться максимум 30 строк начиная 1 PHP: SELECT $my_cols FROM `users` LIMIT 30 OFFSET 1 см. https://wiki.byte-welt.net/wiki/Limit_(SQL) Удачи!
Благодарю. Я вставил подсказанную строчку. PHP: echo var_dump($data); В ответ получил то-ли шпионскую радиограмму, то-ли лирический сонет на марсианском: array(6) { ["admin"]=> array(4) { ["password"]=> string(0) "" [1]=> string(0) "" ["comment"]=> string(13) "Default Admin" [2]=> string(13) "Default Admin" } ["admin1"]=> array(4) { ["password"]=> string(18) "Jgw4LNVekL8jEjq5dU" [1]=> string(18) "Jgw4LNVekL8jEjq5dU" ["comment"]=> string(10) "Admin №1" [2]=> string(10) "Admin №1" } ["admin2"]=> array(4) { ["password"]=> string(18) "UKCMLTS073cq26iIOc" [1]=> string(18) "UKCMLTS073cq26iIOc" ["comment"]=> string(10) "Admin №2" [2]=> string(10) "Admin №2" } ["admin3"]=> array(4) { ["password"]=> string(20) "oU1Qky27TzmFOGFj4c2I" [1]=> string(20) "oU1Qky27TzmFOGFj4c2I" ["comment"]=> string(10) "Admin №3" [2]=> string(10) "Admin №3" } ["admin4"]=> array(4) { ["password"]=> string(18) "JSfkWJWjT6rdI5cgHo" [1]=> string(18) "JSfkWJWjT6rdI5cgHo" ["comment"]=> string(10) "Admin №4" [2]=> string(10) "Admin №4" } ["admin5"]=> array(4) { ["password"]=> string(17) "HLTmJCnzxm2DW6LT9" [1]=> string(17) "HLTmJCnzxm2DW6LT9" ["comment"]=> string(10) "Admin №5" [2]=> string(10) "Admin №5" } } Текстуально он немного отличается от выдачи echo print_r($data, true);, но в целом очень близок. Что я могу понять из этого глубокомысленного текста в контексте моих вопросов?
PHP: foreach ( $data as $user => $row ) { echo "{$user} - " . implode ( ', ', $row ) . PHP_EOL; } --- Добавлено --- потому что PDO::FETCH_UNIQUE , чет сайт не могу найти с перечислениями какой-то pdo doc
Благодарю. Вставил этот код. После запуска получаю: admin - , , Default Admin, Default Admin admin1 - Jgw4LNVekL8jEjq5dU, Jgw4LNVekL8jEjq5dU, Admin №1, Admin №1 admin2 - UKCMLTS073cq26iIOc, UKCMLTS073cq26iIOc, Admin №2, Admin №2 admin3 - oU1Qky27TzmFOGFj4c2I, oU1Qky27TzmFOGFj4c2I, Admin №3, Admin №3 admin4 - JSfkWJWjT6rdI5cgHo, JSfkWJWjT6rdI5cgHo, Admin №4, Admin №4 admin5 - HLTmJCnzxm2DW6LT9, HLTmJCnzxm2DW6LT9, Admin №5, Admin №5 И вот, что странно: 1. $user взят в фигурные скобки, но на экран они не выводятся. Так и должно быть? 2. Если я правильно понимаю, каждая запись должна выводиться в отдельной строке (PHP_EOL). Это не происходит. 3. Значения полей записей почему-то выводятся по два раза. В этой пещере такое сильное эхо? --- Добавлено --- Так, может быть, мне есть резон применить какую-то более удобную дисциплину?
Мда... Несомненно, хамить умеют многие, а вот ответить на вопрос по сути - отнюдь не все. Полагаю, что Вы, mon amie, не можете - поэтому и перешли на такой тон. (Если бы я сам нашел ответ, поясняющий как правильно обращаться к нужным записям этого массива, я не стал бы надоедать сообществу своим вопросом.)
Похоже, у меня получилось обращаться к элементам этого массива. Благодарю всех, кто помог толковым советом!