Как выполнить 2 SQL-запроса один за другим, используя mysqli_multi_query в PHP

Я пытался одновременно вставлять значения в базу данных MySQL, используя mysqli_multi_query, но он не выполняется и переходит к части, если отображается предупреждающее сообщение с сообщением о сбое вставки записи.

Ниже мой 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); 
}
}

person Pradeep    schedule 07.04.2017    source источник
comment
Узнайте о подготовленных заявлениях для предотвращения SQL-инъекций   -  person Jens    schedule 07.04.2017
comment
Используйте mysqli_error(), чтобы распечатать сообщение об ошибке   -  person Jens    schedule 07.04.2017
comment
@jens ... приложение общего назначения .... включено mysqli_error () .. все еще ничего не показывает ...   -  person Pradeep    schedule 07.04.2017
comment
Затем повторите запрос и попробуйте его в консоли mysql.   -  person Jens    schedule 07.04.2017


Ответы (1)


Если столбец id автоматически увеличивается в таблицах, не указывайте этот столбец (и пустое значение) в запросе. В качестве альтернативы вы можете использовать NULL (без кавычек), если вы собираетесь упомянуть столбец в своем запросе.

Многие, многие люди изо всех сил пытаются найти ошибки с помощью своего блока кода mysqli_multi_query(), потому что он не настроен для правильного вывода затронутых строк и ошибок.

Я рекомендую взглянуть на блок кода общего назначения, который поможет изолировать проблемные запросы, и прочитать этот ответ.

Также похоже, что вы зацикливаете два запроса mysqli_multi_query(). Для эффективности я рекомендую создать полный массив запросов, завершить цикл, а затем вызвать mysqli_multi_query() только один раз.

p.s. Есть ли в ваших значениях вставки кавычки? В этом вопросе помогут подготовленные заявления. Используйте блок кода по моей ссылке и проверьте сообщение об ошибке.

ОБНОВЛЕНИЕ: вот мой ответ с ложки (конечно, я на самом деле не проверял его перед публикацией):

// 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);
person mickmackusa    schedule 07.04.2017
comment
@Pradeep Ты скажи мне. Прислушайтесь к моему совету по поводу столбца и значения INSERTed id. Замените свой блок кода запроса предложенным блоком кода из моего связанного ответа - он сообщит вам, если / когда у вас возникнут сбои. Если вы не можете исправить ошибку самостоятельно, отредактируйте свой вопрос с сообщением об ошибке, затем отправьте мне пинг, и я посмотрю. Если мой ответ решит вашу проблему, отметьте его зеленой галочкой. - person mickmackusa; 09.04.2017
comment
Вот ссылка на значение столбца с автоматическим увеличением NULL: in-mysqli" title="правильный способ вставки данных с идентификатором в качестве автоматического увеличения в mysqli"> stackoverflow.com/questions/19406292/ - person mickmackusa; 09.04.2017
comment
@mickmackusa..... когда я выполняю mysqli_multi_query... и печатаю его значение, я получаю логическое значение 1... что это значит...??? насколько мне известно, он успешно выполняется... Тогда почему он переходит в часть цикла if... - person Pradeep; 09.04.2017
comment
@Pradeep У меня есть подозрение, что вы не следуете моему совету и что вы не реализовали предложенный мной блок кода ... потому что, если вы это сделаете, он сообщит вам, сколько строк затронуто и есть ли / где ошибка. . - person mickmackusa; 09.04.2017
comment
@Pradeep Я полностью переписал для вас код. Теперь я надеюсь на выбранный ответ и голосование. Если это по-прежнему не решает вашу проблему, оставьте мне комментарий, объясняющий ошибку/проблему, и я постараюсь помочь еще немного. - person mickmackusa; 09.04.2017
comment
@micmackusa...я реализовал ваш блок кода...Спасибо за совет..,использовал null вместо id в моем запросе, а также использовал mysqli_error..теперь работает f9....большое спасибо,приятель.. - person Pradeep; 10.04.2017