Вниз  PHP и мелкие вопросы
- 29.12.2018 / 17:31
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Online
wRadchuk, ой, у тебя тут несколько проблем.
1. mysql_query. Это настолько устаревший модуль, что в 2к18 упоминаний о нём не должно быть, не говоря уж об использовании. Есть mysqli, есть PDO. Пока не поздно, переходи на них.
2. Проблема с sql в целом.
  1. SELECT * FROM users WHERE login=wRadchuk
-- невалидный запрос. Если ты ищешь текст, то он в кавычках должен быть. Правильно так:
  1. SELECT * FROM users WHERE login="wRadchuk"
3. Тут же проблема с безопасностью. Если вместо логина подставить $request[2] = "1 ; DROP TABLE users", тебе будет очень весело. Почитай, что такое SQL инъекция. Для её предотвращения служат функции экранирования, в PDO это quote.
__________________
 let live
- 29.12.2018 / 18:24
wRadchuk
  Пользователь

wRadchuk 
Сейчас: Offline
aNNiMON, спасибо, я на PHP с 2014 не писал. На счет PDO и mysqli слышал и в дальнейшем буду использовать. За кавычки спасибо, знаю что так можно запустить sql инъекцию, писал так для теста.
- 29.12.2018 / 19:10
wRadchuk
  Пользователь

wRadchuk 
Сейчас: Offline
Пробую через PDO сделать запрос и столкнулся с проблемой. Вот код.
  1. $sql = 'SELECT id,login,password FROM users WHERE id='.$request[3].'';
  2.              # создаем запрос
  3.             $STH = $DBH->query($sql);  
  4.  
  5.              # выбираем режим выборки  
  6.             $STH->setFetchMode(PDO::FETCH_OBJ);  
  7.  
  8.              # выводим результат
  9.             while($row = $STH->fetch())
  10.              {  
  11.                  echo $row->id . "\n";  
  12.                  echo $row->login . "\n";  
  13.                  echo $row->password . "\n";
  14.              }

Как передавать в запрос параметры? не работает из-за этого
  1. WHERE id='.$request[3].'';
Так работает
  1. WHERE id=1

- 29.12.2018 / 20:12
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Online
wRadchuk, посмотри, что тебе в $request[3] приходит. Или выведи для себя содержимое sql-запроса, а потом посмотри, работает ли он в phpmyadmin.
Ну и лучше prepared statement использовать, иначе опять дыры будут.
  1. $stmt = $DBH->prepare('SELECT id, login, password FROM users WHERE id = ?');
  2. $stmt->execute([$request[3]]);
  3. $stmt->setFetchMode(PDO::FETCH_OBJ);  
  4. while($row = $stmt->fetch()) {
  5.     // ...
  6. }

__________________
 let live
- 30.12.2018 / 03:08
wRadchuk
  Пользователь

wRadchuk 
Сейчас: Offline
Дико извиняюсь, но я опять в тупике. В результате выполнения ловлю ответ сервера 500.

  1. <?php
  2.  
  3. require_once('core/db.php'); // Коннект к базе
  4. require_once('core/utils.php'); // Различные функции типа wEscapeDecode($text)
  5.  
  6. // Константы ошибок.
  7. define(COMMAND_DOES_NOT_EXIST, 'Команда не существует');
  8. define(DOES_NOT_HAVE_PARAMETERS, 'Не имеет параметров');
  9.  
  10.  
  11. $request = explode("/", $_SERVER['REQUEST_URI']); // Наш запрос
  12. $responce = array(); // Готовим место под ответ.
  13.  
  14. // Функция для реализации любого типа выборки данных
  15. // $_my_prepare  - запрос на выборку чего либо из базы
  16. // $_my_array - набор данных, которые мы будем вставлять в выборку
  17. // на выходе получаем JSON, если у нас есть доступ для данной выборке
  18. function dataSelection($_my_prepare, $_my_array)
  19. {
  20.     $request = explode("/", $_SERVER['REQUEST_URI']); // Наш запрос
  21.     $my_size = count($request)-2; // Узнаём наличие параметров
  22.     // отнимаем от размера $request[1] = user_ssid и команду = $request[2].
  23.  
  24.     if($my_size>=0)
  25.     {
  26.         // команда на выборку данных
  27.             try {
  28.                     $STH = $DBH->prepare($_my_prepare);
  29.                     $STH->execute($_my_array);
  30.                     $row = $STH->fetchAll(PDO::FETCH_ASSOC);
  31.                     $responce[] = $row;
  32.                     echo wEscapeDecode(json_encode($responce));
  33.                 }catch(PDOException $e) {
  34.                     echo "Хьюстон, у нас проблемы.";  
  35.                     file_put_contents('PDOErrors.txt', $e->getMessage().'\n', FILE_APPEND);
  36.                 }
  37.     }
  38.     else // Если не имеет параметров то отработает данный блок
  39.             echo wEscapeDecode(json_encode(DOES_NOT_HAVE_PARAMETERS));
  40. }
  41.  
  42.  
  43. switch($request[2])
  44.     {
  45.         case 'getUserInfo':
  46.         $my_prepare = 'SELECT * FROM users WHERE id=:id';
  47.         $my_array = array('id' => $request[3]);
  48.         dataSelection($my_prepare, $my_array);
  49.         break;
  50.  
  51.  
  52.         // Если команда не существует
  53.         default:echo wEscapeDecode(json_encode(COMMAND_DOES_NOT_EXIST));
  54.     }
  55.  
  56. ?>

P.S. Все данные в массиве $request[] верны. В чем может быть проблема?
З.Ы. Если была бы ошибка, то решил бы, а я вижу лишь это:
HTTP ERROR 500

Изменено wRadchuk (30.12 / 03:13) (всего 1 раз)
- 30.12.2018 / 10:56
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Online
wRadchuk,
  1. ini_set('display_errors', 1);
  2. error_reporting(E_ALL);
Это включит отображение ошибок.
__________________
 let live
- 30.12.2018 / 21:37
wRadchuk
  Пользователь

wRadchuk 
Сейчас: Offline
aNNiMON, спасибо. Ошибка была в объекте PDO. Пришлось всю инициализацию работы с БД перенести в функцию реализующую запрос. С PDO работать оказалось куда труднее чем я представлял.
- 20.02.2019 / 11:44
miha
  Пользователь

miha 
Сейчас: Offline
Как можно реализовать такую конструкцию? Выглядит так: на странице два текстовых поля и форма выбора файла для загрузки на сервер. Надо чтобы загружать можно было только картинки и чтобы название картинки в итоге состояло из значений этих двух текстовых полей. Например, в первое поле написал text1, во второе word1, в итоге картинка загрузилась и название будет text1_word1.png.
- 20.02.2019 / 12:41
HoldFast
  Пользователь

HoldFast 
Сейчас: Offline
miha, В чём именно проблема?
__________________
 Да, детка, я - Король Ящериц!!!
- 20.02.2019 / 16:39
miha
  Пользователь

miha 
Сейчас: Offline
Ни в чем, сам разобрался.
Наверх  Всего сообщений: 4740
Фильтровать сообщения
Поиск по теме
Файлы топика (129)