forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   PHP / MySQL (http://forum.boolean.name/forumdisplay.php?f=135)
-   -   Не вставляются данные в MySQL (http://forum.boolean.name/showthread.php?t=18115)

seaman 25.04.2013 16:21

Не вставляются данные в 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 и имя. Там масса полей. Но при создании нового пользователя нужно все остальные по дефолту.
Есть два предположения -неверно составлен запрос (я в них почти ни бум бум). Или другое. Там есть три поля - блобы. У которых не дает установить дефолтные значения. Может оттого, что у них нет дефолтных значений строка в таблицу не вставляется.
Подскажите, плиз, - что делаю неверно.
Спасибо.

moka 25.04.2013 17:30

Ответ: Не вставляются данные в MySQL
 
Используй error - функцию, чтобы проверить что MySQL возвращает после запроса.
http://www.php.net/manual/en/mysqli.error.php

seaman 26.04.2013 09:17

Ответ: Не вставляются данные в MySQL
 
Спасибо,помогло.
Оказалось нужно вот так:
Код:

$query = "INSERT INTO `user`  (`id` , `name`) VALUES ($id, `\"$name\"`)";
Иначе эту строковую переменную пытается воспринять как имя поля таблицы.
Это нормально? Если нужно записать строку в поле таблицы из переменной,- нужно так ее оформлять? Или можно как-то проще?

moka 26.04.2013 14:02

Ответ: Не вставляются данные в MySQL
 
Всё верно. И куда проще?

pax 26.04.2013 15:33

Ответ: Не вставляются данные в MySQL
 
Только еще бы сделать защиту от SQL инъекций

Randomize 26.04.2013 16:07

Ответ: Не вставляются данные в MySQL
 
Цитата:

Сообщение от MoKa (Сообщение 257811)
Всё верно. И куда проще?

PHP код:

$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(); 


moka 26.04.2013 16:12

Ответ: Не вставляются данные в MySQL
 
Цитата:

Сообщение от Randomize (Сообщение 257816)
PHP код:

$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(); 


Это не проще - строк больше, функций больше.
Но в плане гибкости имхо так лучше.

Randomize 26.04.2013 16:30

Ответ: Не вставляются данные в MySQL
 
Цитата:

Сообщение от MoKa (Сообщение 257817)
Это не проще - строк больше, функций больше.
Но в плане гибкости имхо так лучше.

защита от инъекций

seaman 27.04.2013 00:05

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

Randomize 27.04.2013 00:43

Ответ: Не вставляются данные в MySQL
 
Цитата:

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

Эскейпинг это не панацея от всех бед!

Например код:
PHP код:

<?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 пролетели. И профукали нашу таблицу юзеров. Такие дела. А ещё после ";" можно много чего и повеселее написать.

Это на вскидку

seaman 27.04.2013 01:55

Ответ: Не вставляются данные в MySQL
 
Ага. А в случае с prepare переданное id уже будет не double, и следовательно bind_param вернет false. Но тогда ведь нужно проверять перед execute что вернул bind_param. Верно? Или можно не проверять? execute тоже просто вернет false, если что-то не так. А запрос просто не выполнится.

Randomize 27.04.2013 03:02

Ответ: Не вставляются данные в MySQL
 
Цитата:

Сообщение от seaman (Сообщение 257866)
Ага. А в случае с prepare переданное id уже будет не double, и следовательно bind_param вернет false. Но тогда ведь нужно проверять перед execute что вернул bind_param. Верно? Или можно не проверять? execute тоже просто вернет false, если что-то не так. А запрос просто не выполнится.

Внутри bind_param идёт не проверка, а именно преобразование.
Например рассмотрим переданную строку "123test"
i - 123
d - 123.0
s - "123test" (с кавычками и отсечением лишних символов будет сразу)

Проверять ли на true или false - на усмотрение программиста.
Главное что прилетят только нужные данные и нужных типов.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot