我有一个包含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);}}
答案 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
选项将UPDATE
和INSERT
语句组合为单个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);