Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Веб-программирование > PHP / MySQL

PHP / MySQL Создание динамических Веб-ресурсов

Ответ
 
Опции темы
Старый 25.04.2013, 16:21   #1
seaman
Знающий
 
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений
(для 180 пользователей)
Не вставляются данные в MySQL

Сорри, если нечто простое.
Есть такое:
<?php
//Это просто статика для упрощения доступа к базе
class DataBase {
   const host = "localhost";
   const user = "***";
   const password = "***";
   const db = "***";
   private static $instance;

   private function __construct() {}
   private function __clone(){}

   public static function call(){
      if(!isset(self::$instance)){
         self::$instance = new MySQLi(self::host, self::user, self::password, self::db);
         if(self::$instance->connect_error){
            throw new Exception('Error MySQL: ' . self::$instance->connect_error);
         }
      }
      return self::$instance;
   }
}
?>
class User
{
   public function User()
   {
...
      $this->insert($this->id, $this->name);
   }
...
   public static function insert($id, $name)
   {
      $query = "INSERT INTO `user`  (`id` , `name`) VALUES ($id, `$name`)";
      DataBase::call()->query($query);
   }
...
}
Вызывается этот скрипт.
<?php
require_once('DataBase.php');
require_once('user.php');
...
   if($my_user == null)
   {
      $my_user = new User($user_id, $user_name);
...
В нем запрашивается пользователь. Если нет - создается новый. При создании нового пользователя должна быть вставка в таблицу мускула. Функция insert вызывается (проверил Xdebug-ом). Однако ничего не вставляется.
В таблице не только два поля id и имя. Там масса полей. Но при создании нового пользователя нужно все остальные по дефолту.
Есть два предположения -неверно составлен запрос (я в них почти ни бум бум). Или другое. Там есть три поля - блобы. У которых не дает установить дефолтные значения. Может оттого, что у них нет дефолтных значений строка в таблицу не вставляется.
Подскажите, плиз, - что делаю неверно.
Спасибо.
(Offline)
 
Ответить с цитированием
Старый 25.04.2013, 17:30   #2
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Не вставляются данные в MySQL

Используй error - функцию, чтобы проверить что MySQL возвращает после запроса.
http://www.php.net/manual/en/mysqli.error.php
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
seaman (27.04.2013)
Старый 26.04.2013, 09:17   #3
seaman
Знающий
 
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений
(для 180 пользователей)
Ответ: Не вставляются данные в MySQL

Спасибо,помогло.
Оказалось нужно вот так:
$query = "INSERT INTO `user`  (`id` , `name`) VALUES ($id, `\"$name\"`)";
Иначе эту строковую переменную пытается воспринять как имя поля таблицы.
Это нормально? Если нужно записать строку в поле таблицы из переменной,- нужно так ее оформлять? Или можно как-то проще?
(Offline)
 
Ответить с цитированием
Старый 26.04.2013, 14:02   #4
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Не вставляются данные в MySQL

Всё верно. И куда проще?
(Offline)
 
Ответить с цитированием
Старый 26.04.2013, 15:33   #5
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Не вставляются данные в MySQL

Только еще бы сделать защиту от SQL инъекций
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
moka (26.04.2013)
Старый 26.04.2013, 16:07   #6
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,354
Написано 2,470 полезных сообщений
(для 6,850 пользователей)
Ответ: Не вставляются данные в MySQL

Сообщение от MoKa Посмотреть сообщение
Всё верно. И куда проще?
$sql "INSERT INTO `user` SET `id` = ? AND `name` = ?";
$stmt DataBase::call()->prepare($sql);
$stmt->bind_param('ds'$varId$varName); // d - digit, s - string
$stmt->execute();
$stmt->close(); 
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Старый 26.04.2013, 16:12   #7
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Не вставляются данные в MySQL

Сообщение от Randomize Посмотреть сообщение
$sql "INSERT INTO `user` SET `id` = ? AND `name` = ?";
$stmt DataBase::call()->prepare($sql);
$stmt->bind_param('ds'$varId$varName); // d - digit, s - string
$stmt->execute();
$stmt->close(); 
Это не проще - строк больше, функций больше.
Но в плане гибкости имхо так лучше.
(Offline)
 
Ответить с цитированием
Старый 26.04.2013, 16:30   #8
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,354
Написано 2,470 полезных сообщений
(для 6,850 пользователей)
Ответ: Не вставляются данные в MySQL

Сообщение от MoKa Посмотреть сообщение
Это не проще - строк больше, функций больше.
Но в плане гибкости имхо так лучше.
защита от инъекций
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Старый 27.04.2013, 00:05   #9
seaman
Знающий
 
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений
(для 180 пользователей)
Ответ: Не вставляются данные в MySQL

Ну защиту от инъекций я сделал stripslashes и escape_string. Надеюсь этого достаточно. По prepare прочитал статейку, что она не очень хороша, увидел что писанины больше и решил не использовать. Сейчас смотрю - вроде действительно удобнее. Почитаю еще, может и перейду на такой способ.
Спасибо.
(Offline)
 
Ответить с цитированием
Старый 27.04.2013, 00:43   #10
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,354
Написано 2,470 полезных сообщений
(для 6,850 пользователей)
Ответ: Не вставляются данные в MySQL

Сообщение от seaman Посмотреть сообщение
Ну защиту от инъекций я сделал stripslashes и escape_string. Надеюсь этого достаточно. По prepare прочитал статейку, что она не очень хороша, увидел что писанины больше и решил не использовать. Сейчас смотрю - вроде действительно удобнее. Почитаю еще, может и перейду на такой способ.
Спасибо.
Эскейпинг это не панацея от всех бед!

Например код:
<?php
echo 'SELECT * FROM users WHERE id =' mysql_real_escape_string($_GET['id']) . ';';
Передадим ему такую конструкцию:
?id=1; DROP TABLE users
Получится SQL запрос:
SELECT * FROM users WHERE id =1; DROP TABLE users;
И stripslashes и mysql_real_escape_string пролетели. И профукали нашу таблицу юзеров. Такие дела. А ещё после ";" можно много чего и повеселее написать.

Это на вскидку
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо Randomize за это полезное сообщение:
moka (27.04.2013), pax (27.04.2013), Reizel (29.04.2013), seaman (27.04.2013)
Старый 27.04.2013, 01:55   #11
seaman
Знающий
 
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений
(для 180 пользователей)
Ответ: Не вставляются данные в MySQL

Ага. А в случае с prepare переданное id уже будет не double, и следовательно bind_param вернет false. Но тогда ведь нужно проверять перед execute что вернул bind_param. Верно? Или можно не проверять? execute тоже просто вернет false, если что-то не так. А запрос просто не выполнится.
(Offline)
 
Ответить с цитированием
Старый 27.04.2013, 03:02   #12
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,354
Написано 2,470 полезных сообщений
(для 6,850 пользователей)
Ответ: Не вставляются данные в MySQL

Сообщение от seaman Посмотреть сообщение
Ага. А в случае с prepare переданное id уже будет не double, и следовательно bind_param вернет false. Но тогда ведь нужно проверять перед execute что вернул bind_param. Верно? Или можно не проверять? execute тоже просто вернет false, если что-то не так. А запрос просто не выполнится.
Внутри bind_param идёт не проверка, а именно преобразование.
Например рассмотрим переданную строку "123test"
i - 123
d - 123.0
s - "123test" (с кавычками и отсечением лишних символов будет сразу)

Проверять ли на true или false - на усмотрение программиста.
Главное что прилетят только нужные данные и нужных типов.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Randomize за это полезное сообщение:
pax (27.04.2013), seaman (27.04.2013)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 21:51.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com