【问题标题】:How do you properly set a blank variable as NULL如何正确将空白变量设置为 NULL
【发布时间】:2010-07-30 05:14:11
【问题描述】:

我正在使用 simplexml_load_file() 将 XML 提要解析为 MYSQL 表。有些变量是空白的,我希望它们是实际的 NULL 而不是 NULL,或者甚至有区别?

$xml = simplexml_load_file('cb.xml') or die ('Bad XML File');
foreach($xml->item as $item) {
    $name = $item->name;

//Tried

if ($name == '') {
    $name = 'NULL';
}

//And

if ($name == '') {
    $name = NULL;
}

mysql_query("INSERT INTO cb (name) VALUES ('$name')");

【问题讨论】:

  • 第二个偶然在 ORACLE 上起作用。

标签: php mysql


【解决方案1】:

这是因为你给 MySQL 一个字符串:

.... ('ANYTHING WITHIN QUOTES IS A STRING')

而 PHP null 值,当“转换”为字符串时,会变成一个空字符串。所以你的第一次尝试给了... ('NULL'),现在它给了... ('')

您必须在查询中使用NULL 关键字(不带引号)将NULL 插入数据库字段。

mysql_query("INSERT INTO cb (name) VALUES (" . ($name == null ? "NULL" : "'$name'") . ")");

哦,和往常一样,请注意不要使用未受保护的$name 变量进行 SQL 注入。

【讨论】:

  • 我得到了它的工作,我只是在使用具有多个 VALUES 变量的语法时遇到了问题。
【解决方案2】:

第二个变量初始化正确;第一个只是字符串 'NULL'(从 PHP 的角度来看,这并不特殊)。但是,您应该使用准备好的语句(MySQLi_STMTPDOStatement。如果您想坚持使用常规 mysql 扩展,请使用 mysql_real_escape_string

PDO 的一个例子是:

$stmt = $pdo_con->prepare("INSERT INTO cb (name) VALUES (?);");
$stmt->execute(array($name));

这将正确处理空值,这与您当前的字符串插值不同。

【讨论】:

【解决方案3】:

如果您使用多个值,并且如果 else 确实有效,那么请执行以下操作:(我们将在第 3 列中插入空数据) * 请注意,单引号被省略了。这是因为“NULL”不能作为 sql 的字符串输入,否则它将是字符串 NULL 而不是我们想要的 SQL NULL。

//condition
if ($col3_var !== NULL)
   $col3_var = "'$col3_var'";
else
   $col3_var = "NULL"; //SQL will omit the "" here

$sql = "INSERT INTO tablename
       (col1, col2, col3...)
       VALUES
       ('$col1_var', '$col2_var', $col3_var)";

$result = mysql_query($sql) or die("Err: " . mysql_error());

【讨论】:

    猜你喜欢
    • 2014-10-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2017-06-21
    • 2017-03-16
    • 2012-11-07
    • 1970-01-01
    相关资源
    最近更新 更多