2017-04-07 10 views
0

J'essayais d'insérer des valeurs simultanément dans la base de données MySQL en utilisant mysqli_multi_query mais il ne s'exécute pas et va si partie montrant un message d'alerte indiquant Echec de l'Insertion d'Enregistrement.Comment exécuter 2 requêtes SQL les unes après les autres en utilisant mysqli_multi_query en PHP

Ci-dessous mon code PHP avec requête

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

En savoir plus sur les commandes préparées pour éviter l'injection SQL – Jens

+0

Utiliser 'mysqli_error()' pour imprimer le message d'erreur – Jens

+0

@jens ... l'application est pour purpouse générale .... inclus mysqli_error() .. ne montrant toujours rien ... – Pradeep

Répondre

0

Si la colonne id est incrémentée automatiquement dans les tableaux, puis omettent la colonne (et la valeur vide) de votre recherche. Alternativement, vous pouvez utiliser NULL (non cité) si vous allez mentionner la colonne dans votre requête.

Beaucoup, beaucoup de gens ont du mal à trouver les erreurs avec leur bloc de code mysqli_multi_query() car il n'est pas configuré pour afficher correctement les lignes affectées et les erreurs.

Je recommande de jeter un oeil à un bloc de code généraliste qui aidera à isoler les requêtes gênantes, et read this answer. Il semble également que vous êtes en train de boucler les deux requêtes mysqli_multi_query(). Pour plus d'efficacité, je recommande de construire la liste complète des requêtes, en terminant la boucle, puis en appelant le mysqli_multi_query() une seule fois.

p.s. Est-ce que l'une de vos valeurs d'insertion contient des guillemets? Des instructions préparées aideraient à résoudre ce problème. Utilisez le bloc de code de mon lien et vérifiez le message d'erreur.

MISE À JOUR: Voici ma réponse nourrie à la cuillère (Bien sûr, je ne l'ai pas testé réellement avant de poster):

// 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 .. ..il ya une erreur dans mon code .... – Pradeep

+0

@Pradeep Vous me dites. Suivez mes conseils sur la colonne et la valeur INSERTed 'id'. Remplacez votre bloc de code de requête par le bloc de code suggéré de ma réponse liée - il vous dira si/quand vous avez des échecs. Si vous ne pouvez pas corriger vous-même l'erreur, éditez votre question avec le message d'erreur, puis envoyez-moi un ping et je jetterai un coup d'oeil. Si ma réponse résout votre problème, veuillez lui attribuer la coche verte. – mickmackusa

+0

Voici une référence sur la valeur de colonne auto-incrémentée 'NULL': http://stackoverflow.com/questions/19406292/proper-way-of-inserting-data-with-id-as-auto-increment-in- mysqli – mickmackusa