2017-04-07 116 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