2014-09-29 5 views
0

Я знаю, что есть другие сообщения по этой теме, но они не отвечают на основной вопрос. В предыдущих ответах все говорят использовать PDO :: PARAM_NULL, но не все ли удаляют всю причину использования PDO?Невозможно установить NULL с PDO

Вот мой код:

$sql = "INSERT INTO users_address (uid,street1,street2,city,state,region,postalcode,country) VALUES (?,?,?,?,?,?,?,?)"; 
    $stmt = $this->db->conn_id->prepare($sql); 
    $stmt->bindParam(1, $uid, PDO::PARAM_INT); 
    $stmt->bindParam(2, $street1, PDO::PARAM_STR); 
    $stmt->bindParam(3, $street2, PDO::PARAM_STR); 
    $stmt->bindParam(4, $city, PDO::PARAM_STR); 
    $stmt->bindParam(5, $state, PDO::PARAM_STR); 
    $stmt->bindParam(6, $region, PDO::PARAM_STR); 
    $stmt->bindParam(7, $postalcode, PDO::PARAM_STR); 
    $stmt->bindParam(8, $country, PDO::PARAM_STR); 
    $stmt->execute(); 

Не все эти значения необходимы для того, иногда они равны нулю. Оба поля базы данных varchar и int имеют значение по умолчанию = null. Как я могу подготовить это так, чтобы, если переменная имеет значение null, значение null вставляется? Все остальные ответы, которые я видел, пропускают NULL для второго параметра, но как я знаю, что во время выполнения это нуль?

Чтобы быть действительно понятным. Я не хочу неявно вставлять нуль. Я хочу вставить переменную, которая может быть пустой, если пользователь не заполнил форму. Не все поля обязательны для заполнения. Например, в этом примере $ street2.

+0

Что именно вы пытаетесь вставить (то есть, что '$ street1',' $ city' ... содержат?) И что вы получаете вместо этого? –

+0

Возможный дубликат [Как вставлять значения NULL с помощью PDO?] (Http://stackoverflow.com/questions/1391777/how-do-i-insert-null-values-using-pdo) – DanFromGermany

+0

Не дублировать Дан и Я объяснил, почему. :) Поля поступают из формы, которая была опубликована. Не все поля требуются, поэтому некоторые могут быть пустыми. Я получаю сообщение об ошибке, которое не может обрабатывать нули. –

ответ

3

В SQL или, по крайней мере, стандартный SQL и большинство SQL ароматизаторов -Ага, я смотрю на вас, Oracle- NULL - это особое значение, которое полностью отличается от пустых строк. В коде SQL вы используете ключевое слово NULL для представления первых и пустых цитат для последнего.

Ваши данные поступают из форм HTML. HTML-формы всегда отправляются в виде обычного текста: у вас нет ничего другого, нет цифр, нет дат ... и, конечно, нет нулей. Всякий раз, когда вам нужен фактический NULL, вам нужна некоторая пост-обработка. К счастью, PDO будет конвертировать PHP аннулирует в нули SQL:

$stmt->bindValue(6, $region!='' ? $region : null, PDO::PARAM_STR); 

PDO (и SQL) просто не знает HTML и не будет делать это за вас.

Я также заменил ваш bindParam() на bindValue(), чтобы сделать все это менее подробным.

+0

Я сделал это и даже установил $ mynull = null и передал его как $ mynull, но получаю это предупреждение: «Только переменные должны передаваться по ссылке». это только предупреждение, но я бы предпочел более чистый код без предупреждений. Нужно ли мне выполнять все задания за пределами привязки? –

+1

Да, вы используете bindParam(), поэтому вам нужно передать действительную переменную. Возможно, вы просто хотите использовать bindValue(). –

1

Использование PARAM_NULL для вставки значения null или другие PARAMS у вас уже есть:

if (!isset($uid) || strlen($uid) == 0) { 
    $stmt->bindParam(1, null, PDO::PARAM_NULL); 
} else { 
    $stmt->bindParam(1, $uid, PDO::PARAM_INT); 
} 
+0

Могу ли я просто использовать тернарный оператор в переменной строке? Полагаю, это сработает. $ stmt-> bindParam (1, ($ uid)? $ Uid: null, PDO :: PARAM_INT); –

+0

Я думаю, что это должно сработать. Я читал, что «PARAM_INT» с нулевыми работами. – DanFromGermany

+0

Почему вы не вставляете пустую строку вместо нуля, когда информация не указана? – DanFromGermany

Смежные вопросы