MySQL вставляет значение NULL после получения значения с помощью $ _REQUEST - PullRequest
0 голосов
/ 06 марта 2012

У меня есть поля ввода, но если пользователи оставляют это поле пустым, я хочу вставить нулевое значение в мою базу данных.

Я запрашиваю такие значения:

$val1 = htmlspecialchars($_REQUEST["val"], ENT_QUOTES);

А затем вставьте их в БД:

INSERT INTO `table` ( `val1` , `val2` , `val3`) 
VALUES ('$val1', '$val2', '$val3');

Я попытался удалить 'вокруг val1, val2, val3 - но тогда в DB ничего не вставляется, если нет значения. Я также пробовал что-то вроде этого:

if (!empty($val1)) {
$val1 = "'".$val1."'";
} else {
$val1 = NULL;}

И затем без 'вокруг значений - все еще нет вставки в БД

Ответы [ 4 ]

2 голосов
/ 06 марта 2012

Хорошо, сначала это

INSERT INTO table (val1, val2, val3) VALUES ('val1', 'val2', 'val3');

будет всегда вставлять только литеральные значения "val1", "val2" и "val3".Вы не используете никакие переменные PHP.

Во-вторых, используйте подготовленные операторы и привязку параметров для выполнения ваших запросов, чтобы защитить себя от внедрения SQL.Например, используя PDO

$pdo = new PDO(/* DSN, username and password, just read the docs */);

$stmt = $pdo->prepare('INSERT INTO table (val1, val2, val3) VALUES (?, ?, ?)');

$params = array(
    isset($_REQUEST['val1']) ? $_REQUEST['val1'] : null,
    isset($_REQUEST['val2']) ? $_REQUEST['val2'] : null,
    isset($_REQUEST['val3']) ? $_REQUEST['val3'] : null
);

$stmt->execute($params);

Кроме того, вам не следует кодировать значения HTML, поступающие в базу данных.Выполните кодировку при отображении значения в документе HTML.

0 голосов
/ 06 марта 2012

Ваша основная проблема заключается в том, что для вставки null в MySQL необходимо использовать постоянную SQL NULL. Цитировать это не будет работать. Это означает, что вы должны заменить '$val1' на NULL в своем выражении SQL.

Эта небольшая ошибка - кое-что подготовленное для вас, как и любой приличный слой ORM.

(Как правило, HTML не требуется экранировать значения перед помещением в базу данных. Но это не связанная с этим проблема.)

0 голосов
/ 06 марта 2012

Всегда будьте осторожны при использовании пользовательских значений во вставках / запросах базы данных - см. http://bobby -tables.com /

<?php

$val1 = 'NULL';
$val2 = 'NULL';
$val3 = 'NULL';

if( isset( $_REQUEST['val1'] ) && !empty( $_REQUEST['val1'] ) )
    $val1 = "'".mysql_real_escape_string( $_REQUEST['val1'] )."'";

if( isset( $_REQUEST['val2'] ) && !empty( $_REQUEST['val2'] ) )
    $val1 = "'".mysql_real_escape_string( $_REQUEST['val2'] )."'";

if( isset( $_REQUEST['val3'] ) && !empty( $_REQUEST['val3'] ) )
    $val1 = "'".mysql_real_escape_string( $_REQUEST['val3'] )."'";


mysql_query("INSERT INTO `table` ( `val1`, `val2`, `val3`) 
VALUES ($val1, $val2, $val3)");

(Я признаю аргумент PDO, но если этот пользователь, как и большинство PHP-сообщества, в настоящее время работает с mysql_* функциями, то кто я такой, чтобы требовать, чтобы они делали иначе?)

0 голосов
/ 06 марта 2012

Если я правильно понимаю, вы подразумеваете что-то вроде этого:

$val1 = null;
$val2 = null;
$val3 = null;

if(isset($_REQUEST['val1']))
    $val1 = "'".mysql_real_escape_string(htmlspecialchars($_REQUEST["val1"], ENT_QUOTES, 'utf-8'))."'";

if(isset($_REQUEST['val2']))
    $val2 = "'".mysql_real_escape_string(htmlspecialchars($_REQUEST["val2"], ENT_QUOTES, 'utf-8'))."'";


if(isset($_REQUEST['val3']))
    $val3 = "'".mysql_real_escape_string(htmlspecialchars($_REQUEST["val3"], ENT_QUOTES, 'utf-8'))."'";


mysql_query("INSERT INTO `table` ( `val1`, `val2`, `val3`) 
VALUES ($val1, $val2, $val3)");

под чем-то вроде этого, я действительно имею в виду, что это упрощенная версия чего-то, что должно быть более защищенным.Вы просто ищете, как передать нулевое значение, поэтому вы можете взять его отсюда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...