2017-04-07 18 views
0

mysqli_multi_query를 사용하여 MySQL 데이터베이스에 값을 동시에 삽입하려고했지만 실행 중이 아니며 레코드 삽입 실패를 알리는 경고 메시지가 표시된 부분으로 이동합니다.PHP에서 mysqli_multi_query를 사용하여 2 개의 SQL 쿼리를 하나씩 실행하는 방법

는 아래 id 열이 자동 증가 테이블에있는 경우, 다음 쿼리에서 열 (그리고 빈 값을) 생략

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

쿼리 내 PHP 코드입니다. 또는 쿼리에서 열을 언급하려는 경우 NULL (따옴표 제외)을 사용할 수 있습니다.

코드 블록이 mysqli_multi_query() 인 경우 많은 사람들이 영향을받는 행과 오류를 제대로 출력하지 못하기 때문에 많은 사람들이이 코드 블록을 사용하여 오류를 찾기 위해 노력합니다.

번거로운 쿼리를 분리하는 데 도움이되는 범용 코드 블록과 read this answer을 살펴 보는 것이 좋습니다.

while 루프가 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); 
+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