如果没有输入数据,如何将 MYSQL phpmyadmin 数据库中的列留空
Posted
技术标签:
【中文标题】如果没有输入数据,如何将 MYSQL phpmyadmin 数据库中的列留空【英文标题】:how to leave a column in a MYSQL phpmyadmin database empty if no data entered 【发布时间】:2020-07-08 17:58:57 【问题描述】:我的数据库中有 5 列:id、post、datetime、name、img_dir
我希望 'name' 和 'img_dir' 列可以选择发布。如果不发布 name 和 img_dar 数据,我将无法发布帖子或日期时间数据。如果我尝试只发布没有名称或 img_dir 的帖子和日期时间,它不会向数据库发送数据。如果没有发布数据,如何将 name 和 img_dir 列设为空白?
$sql = "INSERT INTO $table(post, datetime, name, img_dir)VALUES('$post', '$datetimeOG', '$name', '$img_dir')";
$mysqli->query($sql) or die ($mysqli->error);
【问题讨论】:
请向我们展示show create table
的结果。
我假设 $table
已根据值的白名单进行检查?
this Q&A might help you
两列默认设置为NULL,但问题仍然存在
【参考方案1】:
OP 在评论中声明:
虽然问题仍然存在,但两列默认设置为 NULL
这是因为您将一个空值传递给 SQL,因为您的 SQL 的编写方式,它预计值,即使您没有要插入的值。
所以;这是一个重写,仅在 INSERT 不为空时才向 INSERT 添加值(或者您可以增加特异性*并在它们不是 null
时设置)
注意:
此代码仅用于说明,可能不应该按原样使用,因为它可能从原始代码继承了多个安全问题。在完美的世界中,我建议您重写整个代码库以使用
try..catch
块并使用 MySQL Transactions 和 Prepared Statements(更多关于;-)
的内容)。
$insert = []; //make array
$insert['post'] = $post;
$insert['datetime'] = $datetimeOG;
$insert['name'] = $name;
$insert['img_dir'] = $img_dir;
// Now, we have an array of VALUEs and the KEYs are the column names.
// So let's remove the 'empty' values.
$insert = array_filter($insert);
*注意:
这包括空格、零和“假”值,因此您需要调整到 您自己的确切要求。 有关如何执行此操作的更多信息,请参阅linked question。
参考 - Removing empty array elements
安全旁注:
在这个问题上你的 SQL / php 的安全性有很多问题,远远超出了这个深夜答案的范围,但最重要的是$table
变量。
如果这个$table
变量总是相同的值,它不应该是一个变量并且应该是硬编码的。然后你可以使用Prepared Statements。
如果表变量来自候选名单,则应将其列入白名单,通常使用switch
语句或类似语句。
如果 tavble 变量来自 long 列表,那么您可以使用 REGEX 删除任何讨厌的东西,例如,我将这样做,因为我不知道您的数据是什么样的喜欢:
// remove all non a-z or _ - characters.
$table = preg_replace('/[^a-z_-]/i','',$table);
参考 - How to Insert into MySQL using Perpared Statements
魔法内爆!
数组是神奇的实体。他们可以be imploded(像猴子,但头发和血少)。
所以;我们有$insert
数组和$sql
字符串;
这可以完美地重新组合,甚至在不知不觉中,您将成为大使馆舞会的美女;我的意思是,呃,是的,它会起作用的。
// The column string is made from the array keys
$columns = implode(",",array_flip($insert));
// Be careful to note the quotes...
$values = "'".implode("','", $insert )."'";
创建最终结果.....
所以,让我们把它总结一下吧!
$insert = []; //make array
$insert['post'] = $post;
$insert['datetime'] = $datetimeOG;
$insert['name'] = $name;
$insert['img_dir'] = $img_dir;
$insert = array_filter($insert);
/***
* Check just in case....
***/
if(count($insert) > 0 )
$cleanedTableName = preg_replace('/[^a-z_-]/i','',$table);
$columns = implode(",",array_flip($insert));
// Be careful to note the quotes...
$values = "'".implode("','", $insert )."'";
$sql = INSERT INTO ". $cleanedTableName." (".$columns.") VALUES (".$values.")";
$mysqli->query($sql) or
error_log("You have an SQL Error! (NEVER output your error to screen): ".$mysqli->error);
华丽。我要去泡茶了。
See it in action!!!
【讨论】:
一个全面的答案,所以可以使用更多! @GMB 谢谢。老实说,我很失望,因为我应该对如何使用远远优越的 Prepared Statements 方法执行此操作提供完整的解释和指南,但是现在已经很晚了,我现在没有专注于做这件事@987654339 @以上是关于如果没有输入数据,如何将 MYSQL phpmyadmin 数据库中的列留空的主要内容,如果未能解决你的问题,请参考以下文章