通过SQL

时间:2016-10-28 16:37:10

标签: php sql

我在HTML表格中有几十个输入可用于输入数值。按下提交按钮后,所有输入值都将通过post方法添加到SQL表中的相应列。 <input name="A1>的值将发送到SQL表中的列A1,<input name="A2>发送到列A2,依此类推。

我目前正在使用类似的东西(但有几十个参数)在我的表格中插入数据:

$sql = "INSERT INTO all_stats_table (A1, A2, A3) VALUES ($A1, $A2, $A3)";

这种方法的问题是每个输入都需要填充,否则会导致SQL错误。我最初使用php将所有空输入值设置为0,然后将所有内容发送到数据库,但我不认为这种方法是最有效的方法。

我更愿意动态检查哪些输入实际填充并仅将其值发送到表中,而不是将每个空输入值转换为0并且必须将所有内容发送到数据库。

我已经在SQL中将所有默认值设置为0,但我不知道如何只通过SQL发送填充的输入值。我尝试使用php foreach循环,但我无法找到正确的SQL语法。

我正在尝试做什么?如果不是,那么使这个过程更有效率的最佳做法是什么?

感谢您的帮助

编辑:尝试将akash raigade的优秀解决方案改编为非编号SQL列:

HTML:

<input name='name'>
<input name='address'>
<input name='age'>

PHP:

$Field_list = array ('name','address','age');

$field_string = ''; 
$input_string = ''; 

foreach ($_POST as $userInfo=>$userInfo_value) {
    if (isset($userInfo)) {
        if ($field_string == '') {
            $field_string = $field_string.$userInfo; //problem here ?
            $input_string = $userInfo_value; //problem here ?
        }
        else {
            $field_string = $field_string.','.$userInfo; //problem here ?
            $input_string = $input_string.','.$userInfo_value; //problem here ?
        }
    }
}
$sql = "INSERT INTO protocole_test (".$field_string.") VALUES (".$input_string.")"; 
echo $sql ; //check query formed

4 个答案:

答案 0 :(得分:1)

[升级版]

基本的想法是我们保持INPUT的NAME属性与将要存储的表列名相同。然后在输入标签名称和填充的值的帮助下,我们准备只需要(FILLED)列的SQL语句和价值观。

对于给定的示例,请考虑以下MYSQL表:

 sr.no.|name|age|gender

代码[已测试]:

<input name="name" >
<input name="age" >
<input name="gender" >
<input type='submit'>

<?php 
$field_string ='';
$input_string='';
foreach  ($_POST as $userInfo=>$userInfo_value){
    if($userInfo_value !=''){
        echo $userInfo."->".$userInfo_value;
        if ($field_string == '') {
            $field_string = $field_string.$userInfo; 
            $input_string = $userInfo_value; 
        }
        else {
            $field_string = $field_string.','.$userInfo; 
            $input_string = $input_string.','.$userInfo_value; 
        }
    }
}
$sql = "INSERT INTO protocole_test (".$field_string.") VALUES (".$input_string.")"; 
echo $sql ; //check query formed
?>

[原始答案]看看以下代码:

<input name='a1' id='input_for_name'>
<input name='a2' id='input_for_class'>
<input name='a3' id='input_for_seat.no'>
.
.
<input name='an' id='input_for_n'>

现在

    <?php

//you must be having field list to be inserted i.e
//INSERT INTO all_stats_table >>>(A1, A2, A3)<<< VALUES ($A1, $A2, $A3)
//A1,A2,A3 is field list here 

//so save them into an array.
$Field_list = array ('A1','A2','A3',.......'An');

//Now get which input_field is inputted by :
$i=0;
$field_string = '';
$input_string = '';
for($i<n){
if(isset($_POST['a'.$i])){

   if ($field_string == ''){
      $field_string = $field_string.$Field_list[$i];
      $input_string = $_POST['a'.$i];

}
   else {
   $field_string = $field_string.','.$Field_list[$i];
   $input_string = $input_string.','.$_POST['a'$i];
}}}
    $sql = "INSERT INTO (".$field_string.") VALUES (".$input_string.")";
//to check query formed 
echo $sql ;
    ?>

说明:

我们检查哪个输入字段是FILLED,如果是字段我们将其FIELD添加到FIELD LIST中,并在INPUT LIST中将ITS VALUE添加到最后我们生成SQL语句。

答案 1 :(得分:0)

检查它们是否未定义或为空,如果是,请定义它们。

if ( (!isset($_POST['A1'])) || (empty($_POST['A1']) ){
      $A1 = '0';
} else {
      $A1 = $_POST['A1'];
} 

答案 2 :(得分:0)

我无法对此进行测试,可能需要进行一些调试,但您可以创建一个函数,然后为每个输入调用该函数。有点像...

function chkinput($input){

if ( (!isset($_POST[$input])) || (empty($_POST[$input]) ){
    $$input = '0';
} else {
    $$input = $_POST[$input];
}
return $$input;
}

// You could potentially loop through the post array
// but here I just call the function once per input
chkinput('A1');
chkinput('A2');
...
chkinput('A12');

答案 3 :(得分:0)

循环遍历$_POST数组并检查它是否有值。如果它确实将它连接到变量。像这样:

$fields = "";
$values = "";

foreach($_POST as $key=>$value){
  if($value != ''){
    if($value != end($_POST)){
      $fields .= $key . ", ";
      $values .= "'" . $value . "', ";
    }else{
      $fields .= $key;
      $values .= "'" . $value . "'" ;
    }
  }  
}

$sql = INSERT INTO protocole_test ($fields) VALUES ($values) ;

您的SQL看起来像:

INSERT INTO protocole_test (A1, A2, A3) VALUES ('A1', 'A2', 'A3')