通过4个输入表单为MySQL插入和更新创建循环

时间:2018-06-21 05:31:31

标签: php mysql mysqli

我有一个包含26个项目和3个子项目的表单,需要将其插入到数据库中,我想知道是否有一种方法可以使查询循环以使像这样的一长串查询变得无用。

    $key=$_GET['key'];
    $suc=$_GET['sucursal'];
    $columnas="client_key,sucursal,extra,op1,op2,op3";

    # Inicia inserción de valores de Opciones ...

    #1
    if(empty($_GET['x1'])){ /* nada que ver */ }else{
    if(empty($_GET['op11'])){ $op1='NULL'; }else{ $op1='1'; }
    if(empty($_GET['op21'])){ $op2='NULL'; }else{ $op2='1'; }
    if(empty($_GET['op31'])){ $op3='NULL'; }else{ $op3='1'; }
    if(empty($edit)){
    $extas=mysqli_query($cnx,"INSERT INTO xtr_opt ($columnas)VALUES('$key','$suc','".$_GET['x1']."','$op1','$op2','$op3')")or die($cnx);
    }else{
    $extas=mysqli_query($cnx,"UPDATE xtr_opt SET client_key='$key',sucursal='$suc','extra=".$_GET['x1']."',op1='$op1',op2='$op2',op3='$op3')")or die($cnx);}}
    #2
    if(empty($_GET['x2'])){ /* nada que ver */ }else{
    if(empty($_GET['op12'])){ $op1='NULL'; }else{ $op1='1'; }
    if(empty($_GET['op22'])){ $op2='NULL'; }else{ $op2='1'; }
    if(empty($_GET['op32'])){ $op3='NULL'; }else{ $op3='1'; }
    if(empty($edit)){
    $extas=mysqli_query($cnx,"INSERT INTO xtr_opt ($columnas)VALUES('$key','$suc','".$_GET['x2']."','$op1','$op2','$op3')")or die($cnx);
    }else{
    $extas=mysqli_query($cnx,"UPDATE xtr_opt SET client_key='$key',sucursal='$suc','extra=".$_GET['x2']."',op1='$op1',op2='$op2',op3='$op3')")or die($cnx);}}
    #3
    if(empty($_GET['x3'])){ /* nada que ver */ }else{
    if(empty($_GET['op13'])){ $op1='NULL'; }else{ $op1='1'; }
    if(empty($_GET['op23'])){ $op2='NULL'; }else{ $op2='1'; }
    if(empty($_GET['op33'])){ $op3='NULL'; }else{ $op3='1'; }
    if(empty($edit)){
    $extas=mysqli_query($cnx,"INSERT INTO xtr_opt ($columnas)VALUES('$key','$suc','".$_GET['x3']."','$op1','$op2','$op3')")or die($cnx);
    }else{
    $extas=mysqli_query($cnx,"UPDATE xtr_opt SET client_key='$key',sucursal='$suc','extra=".$_GET['x3']."',op1='$op1',op2='$op2',op3='$op3')")or die($cnx);}}
    #4
    if(empty($_GET['x4'])){ /* nada que ver */ }else{
    if(empty($_GET['op14'])){ $op1='NULL'; }else{ $op1='1'; }
    if(empty($_GET['op24'])){ $op2='NULL'; }else{ $op2='1'; }
    if(empty($_GET['op34'])){ $op3='NULL'; }else{ $op3='1'; }
    if(empty($edit)){
    $extas=mysqli_query($cnx,"INSERT INTO xtr_opt ($columnas)VALUES('$key','$suc','".$_GET['x4']."','$op1','$op2','$op3')")or die($cnx);
    }else{
    $extas=mysqli_query($cnx,"UPDATE xtr_opt SET client_key='$key',sucursal='$suc','extra=".$_GET['x4']."',op1='$op1',op2='$op2',op3='$op3')")or die($cnx);}}

2 个答案:

答案 0 :(得分:2)

使用for循环并将索引连接到输入名称中。

for ($i = 1; $i <= 4; $i++) {
    if(empty($_GET["x$i"])){ /* nada que ver */ }else{
        if(empty($_GET["op1$i"])){ $op1='NULL'; }else{ $op1='1'; }
        if(empty($_GET["op2$i"])){ $op2='NULL'; }else{ $op2='1'; }
        if(empty($_GET["op3$i"])){ $op3='NULL'; }else{ $op3='1'; }
        if(empty($edit)){
            $extas=mysqli_prepare($cnx,"INSERT INTO xtr_opt ($columnas)VALUES(?, ?, ?, ?, ?, ?)")or die($cnx);
            mysqli_stmt_bind_param($extas, "ssisss", $key, $suc, $_GET["x$i"], $op1, $op2, $op3);
        }else{
            $extas=mysqli_prepare($cnx,"UPDATE xtr_opt SET client_key=?, sucursal=?,'extra=?,op1=?,op2=?,op3=?")or die($cnx);
            mysqli_stmt_bind_param($extas, "ssisss", $key, $suc, $_GET["x$i"], $op1, $op2, $op3);
        }
        mysqli_stmt_execute($extas);
    }
}

我还展示了如何使用准备好的语句来防止SQL注入。

请注意,您的代码将文字字符串'NULL'而不是SQL NULL值放入表中。如果您想要一个真正的空值,请删除NULL周围的引号。

您的UPDATE语句也缺少WHERE子句,因此每个语句都将更新表中的行。您可能需要修复该问题。实际上,我怀疑您可以使用INSERT选项将UPDATEINSERT语句组合为单个ON DUPLICATE KEY UPDATE语句。

答案 1 :(得分:1)

我同意@Barmar的答案,该答案与NULL值和错误的更新语句有关。在这里,我还建议另一种实现相同功能的方法,

    $key = $_GET['key'];
    $suc = $_GET['sucursal'];
    $columnas = "client_key,sucursal,extra,op1,op2,op3";

    $arrMain = array(1=>'x1',2=>'x2',3=>'x3',4=>'x4');
    $addQueryValues = "";

    foreach ($arrMain as $key=>$mainVal)
    {
        if(!empty($_GET[$mainVal]))
        {
            $op1 = empty($_GET['op1'.$key])?'NULL':1;
            $op2 = empty($_GET['op2'.$key])?'NULL':1;
            $op3 = empty($_GET['op3'.$key])?'NULL':1;
            if (empty($edit))
            {
                $addQueryValues[] = "('$key','$suc','" . $_GET[$mainVal] . "','$op1','$op2','$op3')";
            }
            else
            {
                $extas = mysqli_query($cnx, "UPDATE xtr_opt SET client_key='$key',sucursal='$suc','extra=" . $_GET[$mainVal] . "',op1='$op1',op2='$op2',op3='$op3')")or die($cnx); // Missing where clause
            }
        }
    }
// Following code will execute all insert statement in to one query
    $allValues = implode(",", $addQueryValues);
    $addQuery = "INSERT INTO xtr_opt ($columnas) VALUES ".$allValues;
    $extas = mysqli_query($cnx, $addQuery) or die($cnx);