2017-04-07 22 views
0

我正在尝试使用mysqli_multi_query将值同时插入到MySQL数据库中,但是它并未执行,并且如果显示警告消息的部分显示记录插入失败。如何在PHP中使用mysqli_multi_query一个接一个地执行2个SQL查询

下面是我的查询PHP代码

while (($emapData = fgetcsv($file, 10000, ",")) !== FALSE) { 
    $sql_tableone = "INSERT into inverterlog (`id`,`timestamp`,`irradiance`,`ambienttemp`,`photovoltaictemp`,`pv1voltage`,`pv2voltage`,`pv3voltage`,`pv1current`,`pv2current`,`pv3current`,`pv1power`,`pv2power`,`pv3power`,`pv1energy`,`pv2energy`,`pv3energy`,`gridvoltagegv1`,`gridvoltagegv2`,`gridvoltagegv3`,`gridcurrentgc1`,`gridcurrentgc2`,`gridcurrentgc3`,`gridpowergp1`,`gridpowergp2`,`gridpowergp3`,`sumofapparentpower`,`gridpowertotal`,`gridenergyge1`,`gridenergyge2`,`gridenergyge3`,`socounter`,`gridcurrentdcgc1`,`gridcurrentdcgc2`,`gridcurrentdcgc3`,`gridresidualcurrent`,`gridfrequencymean`,`dcbusupper`,`dcbuslower`,`temppower`,`tempaux`,`tempctrl`,`temppower1`,`temppowerboost`,`apparentpowerap1`,`apparentpowerap2`,`apparentpowerap3`,`sovalue`,`reactivepowerrp1`,`reactivepowerrp2`,`reactivepowerrp3`,`opmode`,`latestevent`,`pla`,`reactivepowermode`,`overexcitedunderexcited`,`reactivepowerabs`,`inverter`) 
                  values('','$newDate','$emapData[1]','$emapData[2]','$emapData[3]','$emapData[4]','$emapData[5]','$emapData[6]','$emapData[7]','$emapData[8]','$emapData[9]','$emapData[10]','$emapData[11]','$emapData[12]','$emapData[13]','$emapData[14]','$emapData[15]','$emapData[16]','$emapData[17]','$emapData[18]','$emapData[19]','$emapData[20]','$emapData[21]','$emapData[22]','$emapData[23]','$emapData[24]','$emapData[25]','$emapData[26]','$emapData[27]','$emapData[28]','$emapData[29]','$emapData[30]','$emapData[31]','$emapData[32]','$emapData[33]','$emapData[34]','$emapData[35]','$emapData[36]','$emapData[37]','$emapData[38]','$emapData[39]','$emapData[40]','$emapData[41]','$emapData[42]','$emapData[43]','$emapData[44]','$emapData[45]','$emapData[46]','$emapData[47]','$emapData[48]','$emapData[49]','$emapData[50]','$emapData[51]','$emapData[52]','$emapData[53]','$emapData[54]','$emapData[55]','$inverter')"; 
    $sql_tabletwo = "INSERT into data (`id`,`timestamp`,`gridpowertotal`,`inverter`) values ('','$newDate','$emapData[26]','$inverter')"; 
    $sql= $sql_tableone.";".$sql_tabletwo; 
    $result = mysqli_multi_query($con,$sql); 
    if (! $result) { 
     echo "<script type=\"text/javascript\"> 
      alert(\"multi query Record Insertion Failed.\"); 
      </script>"; 
    } 
    fclose($file); 
} 
//throws a message if data successfully imported to mysql database from excel file 
echo "<script type=\"text/javascript\"> 
    alert(\"CSV File has been successfully Imported.\"); 
    window.location = \"four.php\" 
/</script>"; 
//close of connection 
mysqli_close($con); 
} 
} 
+1

了解准备好的发言,以防止SQL注入 – Jens

+0

使用'mysqli_error()'打印出错误消息 – Jens

+0

@jens ...应用程序是针对普通purpouse ....包含mysqli_error()..仍然没有显示任何内容... – Pradeep

回答

0

如果id列是自动递增的表中,然后从查询中省略列(和空值)。或者,如果您要提及查询中的列,则可以使用NULL(未引用)。

许多人很难找到与他们的mysqli_multi_query()代码块有关的错误,因为它没有设置为正确输出受影响的行和错误。

我建议看一看有助于隔离棘手查询的通用代码块,以及read this answer

它也看起来像你在循环mysqli_multi_query()的两个查询。为了提高效率,我建议构建全部查询,完成循环,然后仅调用mysqli_multi_query()一次。

p.s.你的插入值是否有引号?准备好的陈述将有助于解决这个问题。使用我的链接中的代码块并检查错误消息。

UPDATE:这是我的填鸭式的答案(当然,我其实没有发布前测试):

// I assume $newdate is not user declared and considered safe. 
// I am using NULL for your auto-incremented primary key `id`. 
// If you want to be assured that each pair has an identical `id`, perhaps use LAST_INSERT_ID() on second query of pair. 

// establish variables for future use 
$inverterlog_sql="INSERT INTO `inverterlog` (`id`,`timestamp`,`irradiance`,`ambienttemp`,`photovoltaictemp`,`pv1voltage`,`pv2voltage`,`pv3voltage`,`pv1current`,`pv2current`,`pv3current`,`pv1power`,`pv2power`,`pv3power`,`pv1energy`,`pv2energy`,`pv3energy`,`gridvoltagegv1`,`gridvoltagegv2`,`gridvoltagegv3`,`gridcurrentgc1`,`gridcurrentgc2`,`gridcurrentgc3`,`gridpowergp1`,`gridpowergp2`,`gridpowergp3`,`sumofapparentpower`,`gridpowertotal`,`gridenergyge1`,`gridenergyge2`,`gridenergyge3`,`socounter`,`gridcurrentdcgc1`,`gridcurrentdcgc2`,`gridcurrentdcgc3`,`gridresidualcurrent`,`gridfrequencymean`,`dcbusupper`,`dcbuslower`,`temppower`,`tempaux`,`tempctrl`,`temppower1`,`temppowerboost`,`apparentpowerap1`,`apparentpowerap2`,`apparentpowerap3`,`sovalue`,`reactivepowerrp1`,`reactivepowerrp2`,`reactivepowerrp3`,`opmode`,`latestevent`,`pla`,`reactivepowermode`,`overexcitedunderexcited`,`reactivepowerabs`,`inverter`) VALUES (NULL,$newdate"; 
$data_sql="INSERT INTO `data` (`id`,`timestamp`,`gridpowertotal`,`inverter`) VALUES (NULL,'$newDate'"; 
$tally=0; 
$x=0; 

// build all queries 
while(($emapData=fgetcsv($file,10000,","))!==false){ 
    ++$x; 
    $sql[$x]=$inverterlog_sql; // start first query of pair 
    for($i=1; $i<56; ++$i){ 
     $sql[$x].=",'".mysqli_real_escape_string($con,$emapData[$i])."'"; 
    } 
    $sql[$x].=",'".mysqli_real_escape_string($con,$inverter)."');"; // end first query of pair 
    $sql[$x].="$data_sql,'".mysqli_real_escape_string($con,$emapData[26])."','".mysqli_real_escape_string($con,$inverter)."')"; // whole second query of pair 
    fclose($file); 
} 

// run all queries 
if(mysqli_multi_query($con,implode(';',$sql)){ 
    do{ 
     $tally+=mysqli_affected_rows($con); 
    } while(mysqli_more_results($con) && mysqli_next_result($con)); 
} 

// assess the outcome 
if($error_mess=mysqli_error($con)){ 
    echo "<script type=\"text/javascript\">alert(\"Syntax Error: $error_mess\");</script>"; 
}elseif($tally!=$x*2){ // I don't expect this to be true for your case 
    echo "<script type=\"text/javascript\">alert(\"Logic Error: Only $tally row",($tally!=1?"s":"")," inserted\");</script>"; 
}else{ 
    echo "<script type=\"text/javascript\">alert(\"CSV File has been successfully Imported.\"); window.location = \"four.php\"/</script>"; 
} 
mysqli_close($con); 
+0

@mickmackusa .. ..有没有在我的代码错误.... – Pradeep

+0

@Pradeep你告诉我。接受我对INSERT的'id'列&值的建议。将您的查询代码块替换为我的链接答案中的建议代码块 - 它会告诉您是否/何时发生故障。如果您无法自己修复故障,请编辑您的问题并输入错误信息,然后ping我,我会看看。如果我的答案解决了你的问题,请给它一个绿色的勾号。 – mickmackusa

+0

以下是有关'NULL'自动递增列值的参考:http://stackoverflow.com/questions/19406292/proper-way-of-inserting-data-with-id-as-auto-increment-in- mysqli – mickmackusa

相关问题