2 개의 mysqli 쿼리
PHP2 개의 mysqli 쿼리
두 개의 mysqli_queries를 가질 수 있나요? :
mysqli_query($dblink, "INSERT INTO images (project_id, user_id, image_name, date_created, link_to_file, link_to_thumbnail, given_name) VALUES ('$project_id', '$user_id', '$image_name', '$date_created', '$link_to_file', '$thumbnail', '$ImageName')") or die(mysql_error());
mysqli_query($dblink, "INSERT INTO images_history (project_id, user_id, image_name, date_created, link_to_file, link_to_thumbnail, given_name, day, month, year) VALUES ('$project_id', '$user_id', '$image_name', '$date_created', '$link_to_file', '$thumbnail', '$ImageName', '$day', '$month', '$year')") or die(mysql_error());
기본적으로 내 DB에서 두 개의 테이블을 업데이트하려고합니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?
해결법
-
==============================
1.mysqli_multi_query ()로 가능하다.
mysqli_multi_query ()로 가능하다.
예:
<?php $mysqli = new mysqli($host, $user, $password, $database); // create string of queries separated by ; $query = "INSERT INTO images (project_id, user_id, image_name, date_created, link_to_file, link_to_thumbnail, given_name) VALUES ('$project_id', '$user_id', '$image_name', '$date_created', '$link_to_file', '$thumbnail', '$ImageName');"; $query .= "INSERT INTO images_history (project_id, user_id, image_name, date_created, link_to_file, link_to_thumbnail, given_name, day, month, year) VALUES ('$project_id', '$user_id', '$image_name', '$date_created', '$link_to_file', '$thumbnail', '$ImageName', '$day', '$month', '$year');"; // execute query - $result is false if the first query failed $result = mysqli_multi_query($mysqli, $query); if ($result) { do { // grab the result of the next query if (($result = mysqli_store_result($mysqli)) === false && mysqli_error($mysqli) != '') { echo "Query failed: " . mysqli_error($mysqli); } } while (mysqli_more_results($mysqli) && mysqli_next_result($mysqli)); // while there are more results } else { echo "First query failed..." . mysqli_error($mysqli); }
핵심은 단일 호출에서 둘 이상의 쿼리를 실행하려는 경우 mysqli_multi_query를 사용해야한다는 것입니다. 보안상의 이유로, mysqli_query는 SQL 주입을 방지하기 위해 여러 개의 쿼리를 실행하지 않습니다.
또한 mysqli_store_result의 동작을 염두에 두어야한다. 쿼리에 결과 셋이 없으면 (INSERT 쿼리는 그렇지 않음) FALSE를 반환하므로 mysqli_error를 검사하여 INSERT가 성공했다는 의미의 빈 문자열을 반환하는지 확인해야합니다.
만나다: mysqli_multi_query mysqli_more_results mysqli_next_result mysqli_store_result
-
==============================
2.기능:
기능:
함수에 다중 쿼리의 결과를 전달하기 만하면 각 쿼리에서 발견 된 모든 결과와 오류가 반환됩니다.
function loop_multi($result){ //use the global variable $conn in this function global $conn; //an array to store results and return at the end $returned = array("result"=>array(),"error"=>array()); //if first query doesn't return errors if ($result){ //store results of first query in the $returned array $returned["result"][0] = mysqli_store_result($conn); //set a variable to loop and assign following results to the $returned array properly $count = 0; // start doing and keep trying until the while condition below is not met do { //increase the loop count by one $count++; //go to the next result mysqli_next_result($conn); //get mysqli stored result for this query $result = mysqli_store_result($conn); //if this query in the loop doesn't return errors if($result){ //store results of this query in the $returned array $returned["result"][$count] = $result; //if this query in the loop returns errors }else{ //store errors of this query in the $returned array $returned["error"][$count] = mysqli_error($conn); } } // stop if this is false while (mysqli_more_results($conn)); }else{ //if first query returns errors $returned["error"][0] = mysqli_error($conn); } //return the $returned array return $returned; }
용법:
$query = "INSERT INTO table1 (attribute1) VALUES ('value1');"; $query .= "INSERT INTO table2 (attribute2) VALUES ('value2');"; $query .= "SELECT * FROM table3;"; //execute query $result = mysqli_multi_query($conn, $query); //pass $result to the loop_multi function $output = loop_multi($result);
산출
$ 출력에는 쿼리에 의해 정렬 된 2 개의 배열 "result"와 "error"가 포함됩니다. 예를 들어 세 번째 쿼리를 실행할 때 오류가 발생했는지 확인하고 결과를 가져 오는 경우 다음을 수행 할 수 있습니다.
if(isset($output['error'][2]) && $output['error'][2] !== ""){ echo $output['error'][2]; }else{ while($row = $output['result'][2]->fetch_assoc()) { print_r($row); } }
from https://stackoverflow.com/questions/10924127/two-mysqli-queries by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
PHP에서 파일 확장자를 얻는 방법? [복제] (0) | 2018.09.18 |
---|---|
어떻게 링크에서 $ _GET 변수를 부트 스트랩 모달로 전달할 수 있습니까? (0) | 2018.09.18 |
로그인 스크립트에 password_verify를 넣을 위치는 어디입니까? (0) | 2018.09.18 |
멀티 바이트 문자열을 n 개의 문자로 잘림 (0) | 2018.09.18 |
ADOdb의 SQL 주입 및 일반적인 웹 사이트 보안 (0) | 2018.09.18 |