Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP和MySQL-根据非空表单字段插入列_Php_Sql_Forms_Insert - Fatal编程技术网

PHP和MySQL-根据非空表单字段插入列

PHP和MySQL-根据非空表单字段插入列,php,sql,forms,insert,Php,Sql,Forms,Insert,正如标题所说,我试图使用以HTML格式发送的数据将一行插入MySQL表。但是,某些表单字段可以留空。以前,对于select语句,我执行此循环是为了检查哪些字段不是空的,并形成一个SQL查询字符串(仅用于说明),其中$SQL是一个类似“select*FROM table where”的语句: ($i=0;$i

正如标题所说,我试图使用以HTML格式发送的数据将一行插入MySQL表。但是,某些表单字段可以留空。以前,对于select语句,我执行此循环是为了检查哪些字段不是空的,并形成一个SQL查询字符串(仅用于说明),其中$SQL是一个类似“select*FROM table where”的语句:

($i=0;$i<$size;$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)."')";