PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (13): « 1 [2] 3 4 5 6 7 8 9 ... » В конец

> Найдено сообщений: 191
gheka Отправлено: 26 Ноября, 2015 - 00:47:31 • Тема: защита от sql инъекции • Форум: Вопросы новичков

Ответов: 3
Просмотров: 171
Здравствуйте есть запрос

PHP:
скопировать код в буфер обмена
  1.  
  2. $kl = 20;
  3.  
  4. $t = "SELECT * FROM `guest` WHERE `status`='%d' id DESC LIMIT %d,%d";
  5. $result = mysqli_query ( $LinkToBD, sprintf ( $t, mysqli_real_escape_string ( $LinkToBD, '0' ),
  6.                 mysqli_real_escape_string ( $LinkToBD, '3' ),
  7.                 mysqli_real_escape_string ( $LinkToBD, $_GET ['str'] ),
  8.                 mysqli_real_escape_string ( $LinkToBD, $kl ) ));
  9.  
  10.  


Есть проблема если допусти в адресной строке указать
test.ru/guest.php?str=1

то проходит нормально всё

если указать в запросе одинарную кавычку
test.ru/guest.php?str='

то вылазит ошибка
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-15,15' at line 1

Можно конечно проверять $_GET ['str'] на число например так is_int ($_GET ['str']) и это будет работать но может есть более правильный способ?
gheka Отправлено: 03 Мая, 2015 - 18:23:50 • Тема: Вопрос по PDO • Форум: Вопросы новичков

Ответов: 18
Просмотров: 1557
Помогите пожалуйста исправить ошибку, вроде всё правильно но почему то выдаёт синтаксическую ошибку.

вот запрос

PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "SELECT `id` FROM `" . DB_PREFIX . "goods` WHERE `status`=? LIMIT 0,5";
  3. $stmt = $dbh->prepare ( $sql );
  4. $stmt->execute ( array (0) );
  5.  
  6. if ( $data = $stmt->fetchAll () ) {
  7.        
  8.         foreach ( $data as $rows ) {
  9.                 $id_goods = $rows [0];
  10.                 echo $id_goods . '<br />';
  11.         }
  12. }
  13.  

И он работает

Вот точно такой же запрос только числа в LIMIT передаю через EXECUTE ()

PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "SELECT `id` FROM `" . DB_PREFIX . "goods` WHERE `status`=? LIMIT ?,?";
  3. $stmt = $dbh->prepare ( $sql );
  4. $stmt->execute ( array (0, 0, 5) );
  5.  
  6. print_r ($stmt->errorInfo());
  7.  
  8. if ( $data = $stmt->fetchAll () ) {
  9.        
  10.         foreach ( $data as $rows ) {
  11.                 $id_goods = $rows [0];
  12.                 echo $id_goods . '<br />';
  13.         }
  14. }
  15.  


И он не работает выдаёт ошибку:

Array ( [0] => 42000 [1] => 1064 [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0','5'' at line 1 )

Что не так не пойму понятно что дело в переданных данных в LIMIT

Подскажите пожалуйста что не так?
gheka Отправлено: 03 Мая, 2015 - 01:41:23 • Тема: Вопрос по PDO • Форум: Вопросы новичков

Ответов: 18
Просмотров: 1557
exlant пишет:
пример из мануала
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. /* Спровоцируем синтаксическую ошибку SQL */
  3. $stmt = $dbh->prepare('bogus sql');
  4. if (!$stmt) {
  5.     echo "\nPDO::errorInfo():\n";
  6.     print_r($dbh->errorInfo());
  7. }
  8. ?>

http://php.net/manual/ru/pdo.errorinfo.php


Не знаю может если не использовать execute () то сработает и этот вариант но если делать запрос таким
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "UPDATE `" . DB_PREFIX . "goods` SET `name`=? WHERE `id`=?";
  3. $stmt = $dbh->prepare ( $sql );
  4. $stmt->execute ( array ('текс', 107) );
  5. print_r ($stmt->errorInfo () );
  6.  


То ошибка выводится, а если использовать print_r ($dbh->errorInfo () ); то ошибки нет. ПРОВЕРЕНО
gheka Отправлено: 03 Мая, 2015 - 00:56:57 • Тема: Вопрос по PDO • Форум: Вопросы новичков

Ответов: 18
Просмотров: 1557
exlant пишет:
не обязательно, через TRY{} CATCH(){}
у вас ошибка в этом коде:
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "UPDATE `" . DB_PREFIX . "goods` SET `name`=? WHERE `id`=?";
  3. $stmt = $dbh->prepare ( $sql );
  4. $stmt->execute ( array ('текс', 107) );
  5. if (!$stmt)
  6.         print_r ('Ошибка базы данных ' . $stmt->errorInfo () );
  7.  

не $stmt->errorInfo (), а $dbh->errorInfo()


Нет у меня всё верно надо было просто писать вот так print_r ( $stmt->errorInfo () );
а не так print_r ('Ошибка базы данных ' . $stmt->errorInfo () );

Правильно так
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "UPDATE `" . DB_PREFIX . "goods` SET `name`=? WHERE `id`=?";
  3. $stmt = $dbh->prepare ( $sql );
  4. $stmt->execute ( array ('текс', 107) );
  5. print_r ($stmt->errorInfo () );
  6.  
gheka Отправлено: 02 Мая, 2015 - 19:02:40 • Тема: Вопрос по PDO • Форум: Вопросы новичков

Ответов: 18
Просмотров: 1557
Помогите пожалуйста как вывести ошибку при обновлении записи в PDO

В MYSQLI я это делал так

PHP:
скопировать код в буфер обмена
  1.  
  2. $t = "UPDATE `" . DB_PREFIX . "goods` SET `name`='%d' WHERE `id`='%d'";
  3. $result = mysqli_query ( $LinkToBD, sprintf ($t, mysqli_real_escape_string ( $LinkToBD, 'test' ),
  4.                                                         mysqli_real_escape_string ( $LinkToBD, 107 ) ));
  5. if (!$result)
  6.         die ('Ошибка базы данных ' . mysqli_error ( $LinkToBD ) );
  7.  


В PDO делаю так

PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "UPDATE `" . DB_PREFIX . "goods` SET `name`=? WHERE `id`=?";
  3. $stmt = $dbh->prepare ( $sql );
  4. $stmt->execute ( array ('текс', 107) );
  5. if (!$stmt)
  6.         print_r ('Ошибка базы данных ' . $stmt->errorInfo () );
  7.  


Но ошибка не выводится, что я неправильно делаю?

РАЗОБРАЛСЯ С ЭТИМ нужно было запрос делать в

PHP:
скопировать код в буфер обмена
  1.  
  2. try {
  3. // Прибавляем забронированное количество товара, общему количеству
  4. $sql = "UPDATE `" . DB_PREFIX . "goods` SET `name`=? WHERE `id`=?";
  5. $stmt = $dbh->prepare ( $sql );
  6. $stmt->execute ( array ('текс', 107) );
  7.  
  8. }
  9. catch ( PDOException $e ) {
  10.     echo 'ошибка: ' . $e->getMessage();
  11. }
  12.  

ТАК ОШИБКУ ВЫВОДИТ

Но не совсем понятно нужно ли делать TRY () CATCH ()

Для каждого запроса или один раз на странице?
gheka Отправлено: 29 Апреля, 2015 - 21:29:33 • Тема: Вопрос по проверки БД • Форум: Вопросы новичков

Ответов: 15
Просмотров: 487
SanyaSV пишет:
Здравствуйте, буквально 2 день изучаю php..
Пока уровень новичек!

Вот у меня такой вопрос, вот я сделал подключени к БД mysql


Поддержу многих MYSQL устарел поэтому не стоит с ним заморачиватся.
Так-же если планируешь писать серьёзные скрипты то и MYSQLI не стоит особо изучать переходи и изучай PDO.
Тоже когда то начинал с MYSQL потом перешёл на MYSQLI, а теперь вот изучаю PDO так как для серьёзных проектов он больше подходит в нём больше возможностей.
Хотя может и я ошибаюсь может я просто не знаю всех тонкостей mysqli.
gheka Отправлено: 27 Апреля, 2015 - 17:07:37 • Тема: Вопрос по PDO • Форум: Вопросы новичков

Ответов: 18
Просмотров: 1557
DelphinPRO пишет:
Вы бы хоть документацию почитали бы что ли.


Я читал и пробывал я и написал что для меня fetchAll () именно для проверки пустоты данных не совсем удобна. Про цикл речь не идёт там её самое то применять для выборки отдельных полей.


Другое дело, то что мне нужно. За это большое спасибо.
gheka Отправлено: 27 Апреля, 2015 - 12:38:14 • Тема: Вопрос по PDO • Форум: Вопросы новичков

Ответов: 18
Просмотров: 1557
DelphinPRO пишет:
$stmt->fetchAll()


Это не совсем удобно так как получается что бы получит данные из массива нужно писать вот что
$goods [0]['name']

PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "SELECT * FROM `" . DB_PREFIX . "goods` WHERE `status`=?";
  3. $stmt = $dbh->prepare ( $sql );
  4. $stmt = execute ( array (1) );
  5.  
  6. if ( $goods = $stmt->fetchAll() ) {
  7. // Получаем название
  8. $goods [0]['name']
  9. }
  10.  


Есть ещё что то похожее? именно для

PHP:
скопировать код в буфер обмена
  1. if (// проверку на наличие данных) {
  2.  
  3. // Вытаскиваем данные
  4. }
gheka Отправлено: 27 Апреля, 2015 - 02:05:27 • Тема: Вопрос по PDO • Форум: Вопросы новичков

Ответов: 18
Просмотров: 1557
Вот ещё вопрос по PDO

В просто MYSQLI делал проверку на количество затронутых полей в запросе так

PHP:
скопировать код в буфер обмена
  1.  
  2. $t = "SELECT * FROM `" . DB_PREFIX . "goods` WHERE `status`='%d'";
  3. $result = mysqli_query ( $LinkToBD, sprintf ( $t, mysqli_real_escape_string ( $LinkToBD, '1' ) ));
  4.  
  5. if ( mysqli_num_rows ( $result ) != 0 ) {
  6.  
  7. $goods = mysqli_fetch_assoc ( $result );
  8. // Продолжение................
  9.  
  10. }
  11.  
  12.  


Как такое сделать в PDO?

PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "SELECT * FROM `" . DB_PREFIX . "goods` WHERE `status`=?";
  3. $stmt = $dbh->prepare ( $sql );
  4. $stmt = execute ( array (1) );
  5.  
  6. if ( // что сюда вставить ) {
  7. $goods = $stmt->fetch (PDO::FETCH_ASSOC);
  8.  
  9. }
  10.  


Не много по рывшийся нашёл вот такое решение
Оно работает но хотел бы узнать у знающих людей может есть более правильное решение?


PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = "SELECT * FROM `" . DB_PREFIX . "goods` WHERE `status`=?";
  3. $stmt = $dbh->prepare ( $sql );
  4. $stmt = execute ( array (1) );
  5.  
  6. if ( $stmt->rowCount() != 0 ) {
  7. $goods = $stmt->fetch (PDO::FETCH_ASSOC);
  8.  
  9. }
  10.  
  11.  
gheka Отправлено: 26 Апреля, 2015 - 20:13:15 • Тема: Вопрос по PDO • Форум: Вопросы новичков

Ответов: 18
Просмотров: 1557
Спасибо большое глупая ошибка, вот идиот, а я голову морочил.
gheka Отправлено: 26 Апреля, 2015 - 20:03:34 • Тема: Вопрос по PDO • Форум: Вопросы новичков

Ответов: 18
Просмотров: 1557
Здравствуйте начал сейчас разбираться с PDO но при создании файла подключении к базе данных и запроса на выборку SELECT выходит фатальная ошибка, хотя вроде сделал всё правильно.

Вот скрипт соединения с базой

PHP:
скопировать код в буфер обмена
  1.  
  2. //Имя сервера БД / DSN
  3. $bd_host = "localhost";
  4. //Название базы данных
  5. $bd_name = "test_pdo";
  6. //Имя пользователя БД
  7. $bd_user = "root";
  8. //Пароль к БД
  9. $bd_pass = "";
  10. try {
  11.         $db = new PDO ( "mysql:host=$bd_host;bdname=$bd_name;", "$bd_user", "$bd_pass" );
  12.         $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  13.         $db->exec ("SET NAMES utf8");
  14. }
  15. catch ( PDOException $e ) {
  16.     echo 'Подключение не удалось: ' . $e->getMessage();
  17. }
  18.  
  19. define ( "DB_PREFIX", "test_" );
  20.  


Вот запрос на выборку

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. $sql = "SELECT * FROM `" . DB_PREFIX . "user`";
  4. $stmt = $db->query ( $sql );
  5.  
  6. while ( $row = $stmt->fetch (PDO::FETCH_ASSOC) ) {
  7.        
  8.         echo $row ['id'];
  9.        
  10. }
  11.  


И вот что выходит

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected' in Z:\home\magazin_pdo.ru\www\111.php:7 Stack trace: #0 Z:\home\magazin_pdo.ru\www\111.php(7): PDO->query('SELECT * FROM `...') #1 {main} thrown in Z:\home\magazin_pdo.ru\www\111.php on line 7

Даже не знаю что не так. Подскажите пожалуйста где я ошибся?
gheka Отправлено: 25 Апреля, 2015 - 12:47:16 • Тема: Как правильно запускать функцию? • Форум: Вопросы новичков

Ответов: 27
Просмотров: 819
Sail пишет:
gheka, Вы уверены, что в таблице заказов (order) поле id однозначно указывает именно на идентификатор счёта (invoices), а не заказа?
Логично предположить, что в таблице order есть поле с названием, похожим на `id_invoice`... или ещё какая-нить связь между заказом и счётом...


Да нет в таблице ORDER есть естественно свой ID это просто чисто пример, и переменные придуманы от балды.

Мелкий пишет:
Для mysqli доступны штатные методы по работе с транзакцией, примеры посмотрите: http://php.net/manual/en/mysqli.commit.php


Спасибо почитаю.

Мелкий пишет:
И что? Все гвоздями прибиты к myisam?
Разделение в mysql подключаемых стораджей вообще удивительнейшая идея для субд, из-за которой архитектурно появляется куча костылей и многое работает крайне странно. Но переезд с myisam на innodb проходит обычно тихо и спокойно, особенно если специально не пытались отстрелить себе ногу. И позволяет обойти огромнейшее число граблей в поддержке и производительности.
Лично перетаскивал небольшой проект в ~50к строк PHP-кода (если в файлах считать - чуть меньше 500) с myisam на innodb - модификации кода не потребовалось. Вот обратно - да, будет больно. Но зачем?


Да нет, переделать таблицу из MYISAM в INNOBD это думаю не составит труда. Другое дело перейти на PDO так как давно использовал просто MYSQL и не давно только перешёл на MYSQLI весь скрипт перелопатил. Надо было сразу PDO смотреть, просто не привычный стиль и много чего уже не помню из него. Но почитав про PDO выходит, что он не намного отличается от MYSQLI но всё же больше развития происходит с ним. Так что буду подумаю о переходе на PDO
gheka Отправлено: 25 Апреля, 2015 - 10:50:54 • Тема: Как правильно запускать функцию? • Форум: Вопросы новичков

Ответов: 27
Просмотров: 819
Мелкий пишет:
Ну или хотя бы mysqli. Не столь удобен, но тоже неплох.


Но если вы внимательно смотрели примеры то у меня и написано с использованием mysqli


Мелкий пишет:
Только innoDB.


Значит мне это всё не подходи у меня MyISAM

А переделывать это целая история, так как у меня скрипт в 200-300 файлов

Есть какие либо ещё решения?
gheka Отправлено: 25 Апреля, 2015 - 10:28:51 • Тема: Как правильно запускать функцию? • Форум: Вопросы новичков

Ответов: 27
Просмотров: 819
DeepVarvar пишет:
на примере процедурного стиля

PHP:
скопировать код в буфер обмена
mysql_query('START TRANSACTION;');
 
mysql_query('...');
mysql_query('...');
mysql_query('...');
mysql_query('...');
 
mysql_query('COMMIT;');


Спасибо только наверно без ( ; ) mysql_query('START TRANSACTION;');

В моём случае будет так (1)
CODE (PHP):
скопировать код в буфер обмена
  1.  
  2. $t = 'START TRANSACTION';
  3.  
  4. $t = "SELECT `id` FROM `" . DB_PREFIX . "invoices` WHERE `status`='1' AND `state`='0'";
  5. $result = mysqli_query ( $LinkToBD, sprintf ( $t ));
  6.  
  7. if ( mysqli_num_rows ( $result ) != 0 ) {
  8.        
  9.         while ( $array_result = mysqli_fetch_array ( $result ) ) {
  10.                 $id_invoice = $array_result [0];
  11.                
  12.                  test ($id_invoice);
  13.          }
  14. }
  15. $t = 'COMMIT'; 
  16.  
  17. function test ($id_invoices=0) {
  18.  
  19. // Другие SQL запросы
  20.  
  21. }
  22.  
  23.  


Или же так (2)

CODE (PHP):
скопировать код в буфер обмена
  1.  
  2. mysqli_query('START TRANSACTION');
  3.  
  4. $t = "SELECT `id` FROM `" . DB_PREFIX . "invoices` WHERE `status`='1' AND `state`='0'";
  5. $result = mysqli_query ( $LinkToBD, sprintf ( $t ));
  6.  
  7. if ( mysqli_num_rows ( $result ) != 0 ) {
  8.        
  9.         while ( $array_result = mysqli_fetch_array ( $result ) ) {
  10.                 $id_invoice = $array_result [0];
  11.                
  12.                  test ($id_invoice);
  13.          }
  14. }
  15.  
  16. mysqli_query('COMMIT');
  17.  
  18. function test ($id_invoices=0) {
  19.  
  20. // Другие SQL запросы
  21.  
  22. }
  23.  


1 Как правильно на 1 примере или на 2?
2 Я где то читал что транзакции работают только на таблицах InnoDB правда ли это или на MyISAM тоже работает?
gheka Отправлено: 25 Апреля, 2015 - 09:00:43 • Тема: Как правильно запускать функцию? • Форум: Вопросы новичков

Ответов: 27
Просмотров: 819
Спасибо я уже понял что обозначение функции и её запуск не имеет значения в PHP можно запускать функцию как до обозначения её так и после.

Суть моей проблемы как я сейчас понял именно в том что, у меня подобная функция которую я написал в примере в первом сообщении, запускалась из главного файла который прикреплён ко всем фалам моего скрипта. Так как мне необходимо, что бы данная функция запускалась постоянно с заходом нового посетителя на сайт, так как этой функцией обновлялись счета пользователей.

И происходило следующее если в какую ту миллисекунду заходят на сайт 2 посетителя, то функция SELECT на запуск функции срабатывает 2 раза.
И первый цикл не успевает закончится как начинается второй и получается что в базе данных в таблице INVOICES c поле STATE ещё не поменялось на 2 поэтому и получается, что SELECT иногда пропускает 2 раза ID с одним и тем же значением.

По этому я сейчас переделал запуск этой функции в CRON с запуском каждую минуту, там ей и место, почему сразу так не сделал не знаю.
Но у меня есть подобная функция это бронирования товара для покупателя, принцип тот же если одновременно 2 покупателя нажмут кнопку перейти к оплате то проверка на остаток товара может не сработать и получится что 2 покупателя забронируют больше товара чем есть в наличии. По этому без блокировки SELECT тут не обойтись.

Поэтому прошу выложите примеры как блокировать SELECT? на примере процедурного стиля так как я пишу скрипт на нём.

Заранее спасибо.

Страниц (13): « 1 [2] 3 4 5 6 7 8 9 ... » В конец
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB