【问题标题】:INSERT statement gives me '' empty string but it appears to need to be nullINSERT 语句给了我 '' 空字符串,但它似乎需要为空
【发布时间】:2019-09-19 22:37:57
【问题描述】:

好的,我在 php 中有这个类对象,其中创建了 INSERT 语句,因此它不会为 ID 提供值,因为这意味着当它被传递到数据库时简单地自动递增。以前可以用,现在不行了。事实上,它仍然适用于我的实时服务器,但不适用于我的本地主机开发环境。我的sql出来的时候是这样的:

INSERT INTO sessions (u_sess, user_id, school_id, teacher_id, test_id, holder_id, visible, date_created, last_updated) VALUES ('', '1', '1', '', '', '', '', '2019-09-19 22:18:58', '2019-09-19 22:18:58')Database query failed.

当我将它粘贴到我的 phpMyAdmin 的 SQL 窗口中时,它会给我关于问题的更详细的反馈:

1366 - 不正确的整数值:第 1 行的列 'u_sess' 的 ''

所以,我更改了我的 INSERT 语句,使其看起来在第一个位置有一个 NULL,并且将错误向下滚动到下一个 '' 空字符串。所以,我猜测错误来自这样一个事实,即我的 php 对象正在生成一个包含空字符串的 INSERT 语句,而不是所有未知值的 NULL。我不知道如何正确修改我的 php 对象以使其识别并将每个 '' 重新定义为 NULL。我确信这会解决它,因为当我将所有空字符串都更改为 NULL 时……东西最终会正确插入。

这是我的 CREATE 方法:

        global $database;
        $attributes = $this->sanitized_attributes();
        $sql  = "INSERT INTO ".self::$table_name." (";
        $sql .= join(", ", array_keys($attributes));
        $sql .= ") VALUES ('";
        $sql .= join("', '", array_values($attributes));
        $sql .= "')";
        echo $sql;

      if($database->query($sql)) {
        $this->u_sess = $database->insert_id();
        return true;
      } else {
        return false;
      }
    }

【问题讨论】:

    标签: php mysql oop null insert


    【解决方案1】:

    让我们考虑一下function

    function handle($input) {
        return ((!$input) && ($input !== '')) ? "null" : $input;
    }
    

    调用这个function 会产生你喜欢的值。

    【讨论】:

    • 谢谢拉霍斯!我正在接受您的建议或尝试……而反对票肯定不是我。如果您不介意进一步帮助我...我对所有这些 OOP 的工作原理并不那么强大...我想我会随着时间的推移而变得更好,但我希望您能就如何编织提出建议你的功能变成了我在这里所拥有的。我的意思是,在这些步骤中,将这些属性发送到您的函数的最佳时机是什么?而且,你会怎么写呢? $attributes = $this->handle($attributes); ...就在 $sql .= ") VALUES ('"; ...line?
    • @FredericPool 不用担心,我们当时都是 OOP 的初学者(除了那些最初实现它的人)。使用您当前的实现,您需要将 return 更改为 return ((!$input) && ($input !== '')) ? "null" : '"'.$input'"';不用担心查询中的撇号。至于 $attributes 数组,您可以执行类似 foreach($attributes as $key => $value) $attributes[$key] = handle($value);
    • @FredericPool 在您设法解决此问题后,您需要确保通过使用 PDO 来防止 SQL 注入。它处理我们在名为 handle 的函数中处理的逻辑,因此您将不再需要它,您将能够创建参数化查询。不要担心你当前的工作,当再次重写成功时,它被称为重构,当前步骤对你的学习和建立信心很重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多