PHP和MySQL-根据非空表单字段插入列
正如标题所说,我试图使用以HTML格式发送的数据将一行插入MySQL表。但是,某些表单字段可以留空。以前,对于select语句,我执行此循环是为了检查哪些字段不是空的,并形成一个SQL查询字符串(仅用于说明),其中$SQL是一个类似“select*FROM table where”的语句: ($i=0;$i<$size;$i++)的PHP和MySQL-根据非空表单字段插入列,php,sql,forms,insert,Php,Sql,Forms,Insert,正如标题所说,我试图使用以HTML格式发送的数据将一行插入MySQL表。但是,某些表单字段可以留空。以前,对于select语句,我执行此循环是为了检查哪些字段不是空的,并形成一个SQL查询字符串(仅用于说明),其中$SQL是一个类似“select*FROM table where”的语句: ($i=0;$i
{
如果($i!=$size-1){
如果(!empty($formData[$i])){
$sql=$sql。“{$formFields[$i]}类似\“%{$formData[$i]}%\”和“;
}
}否则{
如果(!empty($formData[$i])){
$sql=$sql。“{$formFields[$i]}类似\“%{$formData[$i]}%\”;”;
}
否则{
$sql=substr($sql,0,strlen($sql)-4)。“;”;
}
}
}
但是现在在本例中,一些insert字段可以是空的,而以前这并不重要,因为我正在执行“SELECT*”,我只需要担心where子句。有没有一种更简单的方法可以做到这一点,而不是像怪物一样拥有一个for循环?如果你有一个数组,其中键是字段的名称,那么你可能会得到一个更小的for循环和更少的If条件。一旦您在$\u POST上执行数据清理,您可以执行以下操作
foreach($formFields as $key => $value) {
if(!empty($formFields)) {
// build your query
}
}
至于不遍历所有表单字段,可能没有更快的方法。我想您可以使用array_walk这样的数组函数来迭代所有可用的字段。您仍然需要遍历数组中的每个元素,不过…我会使用foreach循环。这就是他们的目的,他们会让你的代码更容易理解。循环浏览您可能查询或不查询的所有列,如果它们出现在$\u POST/$\u GET中,则添加它们 下面是我编写如下查询的一般策略:
<?php
$formFields = validate( $_REQUEST ); // PLEASE PLEASE PLEASE VALIDATE/ESCAPE YOUR DATA
// You should also normalize HTML name fields to actual MySQL column names, if they're different
// Columns you may or may not want to query
$columns = array( 'foo', 'bar', 'buzz' );
$where = array();
foreach( $columns as $column )
{
if( ! empty($formFields[$column]) )
{
$where[] = "$column = {$formFields[$column]}";
}
}
$where = implode( ' AND ', $set );
$sql = "SELECT * FROM t WHERE $where";
您需要同时构建两个字符串,一个用于字段列表,一个用于值列表
$fields = [];
$values = [];
for ($i = 0; $i < $size; $i++) {
if( !empty($formData[$i]) ) {
array_push($fields,$formFields[$i]);
array_push($values,$formData[$i]);
}
}
}
$sql = "INSERT INTO table(`".implode("`,`",$fields)."`) VALUES('".implode("','",$values)."')";
$fields=[];
$values=[];
对于($i=0;$i<$size;$i++){
如果(!empty($formData[$i])){
数组_push($fields,$formFields[$i]);
数组_push($value,$formData[$i]);
}
}
}
$sql=“插入到表(`.introde(`,`,`,$fields)。”`)值(''.introde('',',$VALUES)。”);
当然,这是假设您至少有一个非空白字段,并且已经采取了必要的预防措施来防止注入。说真的,要小心小Bobby表:构建这样的sql字符串是灾难性的。您正在寻找的(并将使调试更容易)是参数化查询
从这里开始:我很困惑。。。当您想要插入时,为什么需要选择任何内容?您可以在MySQL中的列中插入空格。有什么问题吗?您想如何处理空格?表单字段中可能有与查询本身无关的内容。在我看来,最好遍历要查询的列,看看它们是否存在于用户提交的数据中。
$fields = [];
$values = [];
for ($i = 0; $i < $size; $i++) {
if( !empty($formData[$i]) ) {
array_push($fields,$formFields[$i]);
array_push($values,$formData[$i]);
}
}
}
$sql = "INSERT INTO table(`".implode("`,`",$fields)."`) VALUES('".implode("','",$values)."')";