|
PHP / MySQL Создание динамических Веб-ресурсов |
25.04.2013, 16:21
|
#1
|
Знающий
Регистрация: 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
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Не вставляются данные в MySQL
Используй error - функцию, чтобы проверить что MySQL возвращает после запроса.
http://www.php.net/manual/en/mysqli.error.php
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
26.04.2013, 09:17
|
#3
|
Знающий
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений (для 180 пользователей)
|
Ответ: Не вставляются данные в MySQL
Спасибо,помогло.
Оказалось нужно вот так:
$query = "INSERT INTO `user` (`id` , `name`) VALUES ($id, `\"$name\"`)";
Иначе эту строковую переменную пытается воспринять как имя поля таблицы.
Это нормально? Если нужно записать строку в поле таблицы из переменной,- нужно так ее оформлять? Или можно как-то проще?
|
(Offline)
|
|
26.04.2013, 14:02
|
#4
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Не вставляются данные в MySQL
Всё верно. И куда проще?
|
(Offline)
|
|
26.04.2013, 15:33
|
#5
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Не вставляются данные в MySQL
Только еще бы сделать защиту от SQL инъекций
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
26.04.2013, 16:07
|
#6
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,361
Написано 2,473 полезных сообщений (для 6,856 пользователей)
|
Ответ: Не вставляются данные в 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 4090 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
|
.
Регистрация: 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
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,361
Написано 2,473 полезных сообщений (для 6,856 пользователей)
|
Ответ: Не вставляются данные в MySQL
Сообщение от MoKa
Это не проще - строк больше, функций больше.
Но в плане гибкости имхо так лучше.
|
защита от инъекций
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 4090 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
|
Знающий
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений (для 180 пользователей)
|
Ответ: Не вставляются данные в MySQL
Ну защиту от инъекций я сделал stripslashes и escape_string. Надеюсь этого достаточно. По prepare прочитал статейку, что она не очень хороша, увидел что писанины больше и решил не использовать. Сейчас смотрю - вроде действительно удобнее. Почитаю еще, может и перейду на такой способ.
Спасибо.
|
(Offline)
|
|
27.04.2013, 00:43
|
#10
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,361
Написано 2,473 полезных сообщений (для 6,856 пользователей)
|
Ответ: Не вставляются данные в MySQL
Сообщение от seaman
Ну защиту от инъекций я сделал stripslashes и escape_string. Надеюсь этого достаточно. По prepare прочитал статейку, что она не очень хороша, увидел что писанины больше и решил не использовать. Сейчас смотрю - вроде действительно удобнее. Почитаю еще, может и перейду на такой способ.
Спасибо.
|
Эскейпинг это не панацея от всех бед!
Например код:
<?php echo 'SELECT * FROM users WHERE id =' . mysql_real_escape_string($_GET['id']) . ';';
Передадим ему такую конструкцию:
Получится 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 4090 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 за это полезное сообщение:
|
|
27.04.2013, 01:55
|
#11
|
Знающий
Регистрация: 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
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,361
Написано 2,473 полезных сообщений (для 6,856 пользователей)
|
Ответ: Не вставляются данные в 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 4090 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 за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:56.
|