MySQL e PHP - insira NULL em vez de string vazia


88

Eu tenho uma instrução MySQL que insere algumas variáveis ​​no banco de dados. Recentemente, adicionei 2 campos que são opcionais ($ intLat, $ intLng). Agora, se esses valores não forem inseridos, passo uma string vazia como um valor. Como faço para passar um valor NULL explícito para o MySQL (se vazio)?

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
          VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$long', 
                  '$intLat', '$intLng')";
mysql_query($query);

Respostas:


143

Para passar um NULL para o MySQL, você faz exatamente isso.

INSERT INTO table (field,field2) VALUES (NULL,3)

Portanto, em seu código, verifique se if $intLat, $intLngsão empty, se forem, use em NULLvez de '$intLat'ou '$intLng'.

$intLat = !empty($intLat) ? "'$intLat'" : "NULL";
$intLng = !empty($intLng) ? "'$intLng'" : "NULL";

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
          VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$long', 
                  $intLat, $intLng)";

9
Isso não adiciona um valor NULL do mysql. Isso define o atributo para a string "NULL", que é diferente do valor NULL do mysql. Só estou dizendo que você escreveu duas coisas diferentes, a primeira está correta, a segunda nem tanto, eu acho.
G4bri3l

23
@ G4bri3l: Na $querystring, $intLate $intLngnão estão entre aspas. Então, quando as variáveis ​​forem interpoladas, será , NULL, NULL);.
Rocket Hazmat de

2
Oh sim, eu vejo isso agora. Agradável! Obrigado por me
informar

@ G4bri3l: Sem problemas. Estou aqui para ajudar :)
Rocket Hazmat

3
@alessadro: Esta questão é muito antiga. Se você está concatenando variáveis ​​em uma consulta SQL como essa, está fazendo isso errado! Passe a usar instruções preparadas em PDO ou MySQLi.
Rocket Hazmat

17

Se você não passar valores, obterá valores nulos para os padrões.

Mas você pode simplesmente passar a palavra NULL sem aspas.


8
Ele só obterá NULL por padrão, se a tabela for configurada dessa forma.
Rocket Hazmat

2
Para mim, isso é o que significa "opcional".
dkretz


13

Tudo que você precisa fazer é: $variable =NULL;// e passá-lo na consulta de inserção. Isso irá armazenar o valor como NULL em mysql db


Não há necessidade de aspas em torno do "NULL".
Louis

4

Normalmente, você adiciona valores regulares a mySQL, a partir de PHP como este:

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
}

Quando seus valores são vazios / nulos ($ val1 == "" ou $ val1 == NULL), e você deseja que NULL seja adicionado ao SQL e não 0 ou string vazia, ao seguinte:

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
}

Observe que nulo deve ser adicionado como "NULL" e não como "'NULL'". Os valores não nulos devem ser adicionados como "'". $ Val1. "'", Etc.

Espero que isso ajude, eu apenas tive que usar isso para alguns registradores de dados de hardware, alguns deles coletando temperatura e radiação, outros apenas radiação. Para aqueles sem o sensor de temperatura, eu precisava de NULL e não de 0, por razões óbvias (0 também é um valor de temperatura aceito).


Para números inteiros definidos por coluna, a outra solução funciona bem, mas para campos de texto, tive que dividir a consulta como acima em uma concatenação de string, como o radhoo fez acima. $ query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (". "NULL". ",". $ val2. ")";
Brian

2

sua consulta pode ser a seguinte:

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
      VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$lng', '" . ($lat == '')?NULL:$lat . "', '" . ($long == '')?NULL:$long . "')";
mysql_query($query);

2
$ intLat e $ intLng são os opcionais.
Rocket Hazmat

Isso não vai funcionar. Existem algumas coisas erradas com este trecho de código (além de usar as variáveis ​​erradas, como Rocket apontou). Devido à precedência do operador ternário, você precisará de parênteses ao redor da expressão. Mas, crucialmente, você ainda está envolvendo o valor da coluna entre aspas simples, então você está de volta à estaca zero, atribuindo uma string, não um banco de dados NULL. Além disso, você está usando a NULLpalavra-chave PHPs (sem aspas ), que é avaliada como uma string vazia em um contexto de string, portanto, novamente, você está atribuindo uma string vazia .
MrWhite

1

Verifique as variáveis ​​antes de construir a consulta, se estiverem vazias, altere-as para a string NULL


1

você pode fazer isso por exemplo com

UPDATE `table` SET `date`='', `newdate`=NULL WHERE id='$id'

1

Por algum motivo, a solução do radhoo não funcionaria para mim. Quando usei a seguinte expressão:

$query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (".
    (($val1=='')?"NULL":("'".$val1."'")) . ", ".
    (($val2=='')?"NULL":("'".$val2."'")) . 
    ")";

'null' (com aspas) foi inserido em vez de nulo sem aspas, tornando-o uma string em vez de um inteiro. Então, finalmente tentei:

$query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (".
    (($val1=='')? :("'".$val1."'")) . ", ".
    (($val2=='')? :("'".$val2."'")) . 
    ")";

O espaço em branco resultou na inserção do nulo correto (sem aspas) na consulta.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.