Как получить NULL в целочисленный столбец MySQL с помощью PHP / MySQLi? - PullRequest
3 голосов
/ 27 апреля 2011

Я передаю значения на страницу PHP через URL и использую их в запросах с MySQLi. Проблема в том, что пустая строка преобразуется в ноль для целочисленного столбца, хотя на самом деле она должна быть NULL.

Как получить NULL в целочисленном столбце с помощью PHP / MySQLi из параметра, переданного в URL?

Обновление: Вот пример того, как я использовал бы входящий параметр и подготовленный оператор для вставки. Мне нужно быть NULL в БД - это $ specialtyType.

function InsertItem($itemID, $ownerID, $specialtyType)
{
    $this->insertItemStmt->bind_param("ssi", $itemID, $ownerID, $specialtyType);
    $this->insertItemStmt->execute();

Если я добавлю предложенную Джейсоном строку перед bind_param (установив промежуточную переменную и используя ее в bind_param вместо $ specialty_type), она будет содержать 0 после execute ().

Ответы [ 5 ]

1 голос
/ 01 мая 2013

У меня была эта проблема, и я просто изменил соответствующие столбцы БД с INT на VARCHAR.Пустые значения теперь сохраняются как NULL, а 0 - это 0. Даже при удалении 0 в PHP MyAdmin будет видеть всплывающее окно «0», поэтому я предполагаю, что INT равно пустому с нулем, а VARCHAR - нет.

1 голос
/ 27 апреля 2011

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

1 голос
/ 18 июня 2012

Для MySQLi вы не можете передавать константу, такую ​​как NULL или 0, или даже "NULL" в качестве аргумента bind_param ().

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

Но обойти это легко.Просто создайте одноразовую переменную.В проекте, над которым я работал, мне нужно было вставить некоторые данные в поле BLOB.К сожалению, MySQLi не позволяет вам связывать двоичные данные, если они длиннее определенной длины.Вы должны связать NULL и затем продолжить отправку двоичной информации через send_long_data () .

Но, опять же, вы не можетесвяжите константу как NULL, поэтому в примере посмотрите, где я использовал переменную $ Dummy .

$InfoToInsert = array
(
    'a number' => 9000,
    'a double' => 9000.0,
    'a string' => 'Hello World',
    'a blob' => gzdeflate('Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed')
);
$Stmnt =
(
    'INSERT INTO _mytable '.
        '(_myintcol, _mydoublecol _mystringcol, _myblobcol) '.
    'VALUES '.
        '(?, ?, ?, ?)'
);
if(!$PreparedStmnt = $Conn->prepare($Stmnt))
{
    $OutputError = 'Failure preparing statement: '.my_SanitizeHtml($Conn->error).'<br /><br />Full query:<br />'.$Stmnt;
    $Conn->rollback();
    $Conn->close();
    return(false);
}
$Dummy = null;
$PreparedStmnt->bind_param
(
    'idsb',                         // Possible types:
                                    //     i for Integer
                                    //     d for Double
                                    //     s for String
                                    //     b for BLOB

    $InfoToInsert['a number'],      // _myintcol
    $InfoToInsert['a double'],      // _mydoublecol
    $InfoToInsert['a string'],      // _mystringcol
    $Dummy                          // _myblobcol
);
$PreparedStmnt->send_long_data(3, $InfoToInsert['a blob']); // 3 because it's the 4th parameter (-1 for zero-based)
if(!$PreparedStmnt->execute())
{
    $OutputError = 'Failure inserting report: '.my_SanitizeHtml($Conn->error);
    $PreparedStmnt->close();
    $Conn->rollback();
    $Conn->close();
    return(false);
}
$PreparedStmnt->close();
1 голос
/ 27 апреля 2011
$int_value = empty($_GET['int_value']) && $_GET['int_value'] !== '0' ? 'NULL' : (int)$_GET['int_value'];

Используйте $int_value для столбца в вашем INSERT.Обратите внимание, что is_int() в этом случае бесполезен, так как все значения $_GET хранятся в виде строк.Отсюда и строгое сравнение строк до нуля.

0 голосов
/ 10 октября 2013

Обычно вы добавляете обычные значения в mySQL из PHP следующим образом:

function addValues($val1, $val2) {
    db_open(); // just some code ot open the DB 
    $query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES ('$val1', '$val2')";
    $result = mysql_query($query);
    db_close(); // just some code to close the DB
}

Если ваши значения пустые / нулевые ($ val1 == "" или $ val1 == NULL) и вы хотите, чтобы в SQL добавлялось NULL, а не 0 или пустая строка, к следующему:

function addValues($val1, $val2) {
    db_open(); // just some code ot open the DB 
    $query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (".
        (($val1=='')?"NULL":("'".$val1."'")) . ", ".
        (($val2=='')?"NULL":("'".$val2."'")) . 
        ")";
    $result = mysql_query($query);
    db_close(); // just some code to close the DB
}

Обратите внимание, что null должен быть добавлен как "NULL", а не как "NULL". Ненулевые значения должны быть добавлены как «». $ Val1. «» И т. Д.

Надеюсь, это поможет, мне просто пришлось использовать это для некоторых аппаратных регистраторов данных, некоторые из которых собирают температуру и излучение, другие - только излучение. Для тех, у кого нет датчика температуры, мне понадобилось NULL, а не 0, по понятным причинам (0 также является допустимым значением температуры). Затем данные используются для построения некоторых графиков, доступных здесь .

...