mysql에 PHP 배열을 통해 여러 행 삽입
PHPmysql에 PHP 배열을 통해 여러 행 삽입
삽입 명령을 사용하여 PHP를 통해 MySQL 테이블에 큰 데이터 세트를 전달할 것입니다. 마일 길이가 긴 문자열의 끝에 각 값을 추가하는 것 외에 다른 쿼리를 통해 한 번에 약 1000 개의 행을 삽입 할 수 있는지 궁금합니다. 그것을 실행. 그 기능을 사용할 수 있도록 CodeIgniter 프레임 워크를 사용하고 있습니다.
해결법
-
==============================
1.
하나의 INSERT 문을 여러 행으로 어셈블하는 것은 MySQL 당 하나의 행당 하나의 INSERT 문보다 훨씬 빠릅니다.
즉, PHP에서 문자열 처리 문제가 발생하는 것처럼 들리 겠지만, 언어 문제가 아닌 알고리즘 문제입니다. 기본적으로 큰 문자열로 작업 할 때 불필요한 복사를 최소화하고자합니다. 주로 이것은 연결을 피하고자 함을 의미합니다. 한 줄에 수백 개의 행을 삽입하는 것과 같이 큰 문자열을 만드는 가장 빠르고 효율적인 방법은 implode () 함수와 배열 할당을 이용하는 것입니다.
$sql = array(); foreach( $data as $row ) { $sql[] = '("'.mysql_real_escape_string($row['text']).'", '.$row['category_id'].')'; } mysql_query('INSERT INTO table (text, category) VALUES '.implode(',', $sql));
이 방법의 장점은 지금까지 각 어셈블리로 어셈블 한 SQL 문을 복사하고 다시 복사하지 않는다는 것입니다. 대신 PHP는 implode () 문에서이 작업을 한 번 수행합니다. 이것은 큰 승리입니다.
함께 넣을 열이 많고 하나 이상이 길면 같은 일을하는 내부 루프를 만들고 implode ()를 사용하여 values 절을 외부 배열에 할당 할 수 있습니다.
-
==============================
2.
codeigniter가 다중 삽입 / 배치 삽입을 지원합니다. 나는 똑같은 문제가 있었다. 질문에 대답하는 것은 매우 늦기는하지만 누군가에게 도움이 될 것입니다. 그것이이 질문에 답하는 이유입니다.
$data = array( array( 'title' => 'My title' , 'name' => 'My Name' , 'date' => 'My date' ), array( 'title' => 'Another title' , 'name' => 'Another Name' , 'date' => 'Another date' ) ); $this->db->insert_batch('mytable', $data); // Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')
-
==============================
3.
mysqli_stmt 클래스를 사용하여 하나의 행을 삽입하는 쿼리를 준비한 다음 데이터 배열을 반복 할 수있다. 같은 것 :
$stmt = $db->stmt_init(); $stmt->prepare("INSERT INTO mytbl (fld1, fld2, fld3, fld4) VALUES(?, ?, ?, ?)"); foreach($myarray as $row) { $stmt->bind_param('idsb', $row['fld1'], $row['fld2'], $row['fld3'], $row['fld4']); $stmt->execute(); } $stmt->close();
여기서 'idsb'는 바인딩 할 데이터의 유형입니다 (int, double, string, blob).
-
==============================
4.
나는 이것이 오래된 쿼리라는 것을 알고 있지만, 나는 단지 읽고 있었고 내가 다른 곳에서 발견 한 것을 추가 할 것이라고 생각했다.
PHP 5의 mysqli는 위의 대답에 대한 삽입 시간을 단축 할 수있는 좋은 기능을 가진 객체입니다.
$mysqli->autocommit(FALSE); $mysqli->multi_query($sqlCombined); $mysqli->autocommit(TRUE);
많은 행을 삽입 할 때 autocommit을 끄면 삽입 속도가 크게 향상되므로 위에서 설명한대로 실행하거나 세미콜론 및 다중 쿼리로 구분 된 많은 삽입 명령문 인 문자열 (sqlCombined)을 작성하여 잘 처리 할 수 있습니다.
희망이 사람이 시간을 절약하는 데 도움이 (검색 및 삽입!)
아르 자형
-
==============================
5.
항상 mysql의 LOAD DATA를 사용할 수있다.
LOAD DATA LOCAL INFILE '/full/path/to/file/foo.csv' INTO TABLE `footable` FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'
한 무리의 INSERT 문을 사용하는 대신 대량 삽입을 수행해야합니다.
-
==============================
6.
글쎄, 당신은 1000 쿼리 호출을 실행하고 싶지 않지만,이 일을 잘하고 있습니다 :
$stmt= array( 'array of statements' ); $query= 'INSERT INTO yourtable (col1,col2,col3) VALUES '; foreach( $stmt AS $k => $v ) { $query.= '(' .$v. ')'; // NOTE: you'll have to change to suit if ( $k !== sizeof($stmt)-1 ) $query.= ', '; } $r= mysql_query($query);
데이터 소스에 따라 배열을 채우는 작업은 파일을 열고 file ()을 통해 배열로 내용을 덤프하는 것처럼 쉽습니다.
-
==============================
7.
$query= array(); foreach( $your_data as $row ) { $query[] = '("'.mysql_real_escape_string($row['text']).'", '.$row['category_id'].')'; } mysql_query('INSERT INTO table (text, category) VALUES '.implode(',', $query));
-
==============================
8.
다음과 같이 사용되는 여러 줄을 수행하는 클래스를 만들었습니다.
$pdo->beginTransaction(); $pmi = new PDOMultiLineInserter($pdo, "foo", array("a","b","c","e"), 10); $pmi->insertRow($data); // .... $pmi->insertRow($data); $pmi->purgeRemainingInserts(); $pdo->commit();
여기서 클래스는 다음과 같이 정의됩니다.
class PDOMultiLineInserter { private $_purgeAtCount; private $_bigInsertQuery, $_singleInsertQuery; private $_currentlyInsertingRows = array(); private $_currentlyInsertingCount = 0; private $_numberOfFields; private $_error; private $_insertCount = 0; /** * Create a PDOMultiLine Insert object. * * @param PDO $pdo The PDO connection * @param type $tableName The table name * @param type $fieldsAsArray An array of the fields being inserted * @param type $bigInsertCount How many rows to collect before performing an insert. */ function __construct(PDO $pdo, $tableName, $fieldsAsArray, $bigInsertCount = 100) { $this->_numberOfFields = count($fieldsAsArray); $insertIntoPortion = "REPLACE INTO `$tableName` (`".implode("`,`", $fieldsAsArray)."`) VALUES"; $questionMarks = " (?".str_repeat(",?", $this->_numberOfFields - 1).")"; $this->_purgeAtCount = $bigInsertCount; $this->_bigInsertQuery = $pdo->prepare($insertIntoPortion.$questionMarks.str_repeat(", ".$questionMarks, $bigInsertCount - 1)); $this->_singleInsertQuery = $pdo->prepare($insertIntoPortion.$questionMarks); } function insertRow($rowData) { // @todo Compare speed // $this->_currentlyInsertingRows = array_merge($this->_currentlyInsertingRows, $rowData); foreach($rowData as $v) array_push($this->_currentlyInsertingRows, $v); // if (++$this->_currentlyInsertingCount == $this->_purgeAtCount) { if ($this->_bigInsertQuery->execute($this->_currentlyInsertingRows) === FALSE) { $this->_error = "Failed to perform a multi-insert (after {$this->_insertCount} inserts), the following errors occurred:".implode('<br/>', $this->_bigInsertQuery->errorInfo()); return false; } $this->_insertCount++; $this->_currentlyInsertingCount = 0; $this->_currentlyInsertingRows = array(); } return true; } function purgeRemainingInserts() { while ($this->_currentlyInsertingCount > 0) { $singleInsertData = array(); // @todo Compare speed - http://www.evardsson.com/blog/2010/02/05/comparing-php-array_shift-to-array_pop/ // for ($i = 0; $i < $this->_numberOfFields; $i++) $singleInsertData[] = array_pop($this->_currentlyInsertingRows); array_reverse($singleInsertData); for ($i = 0; $i < $this->_numberOfFields; $i++) array_unshift($singleInsertData, array_pop($this->_currentlyInsertingRows)); if ($this->_singleInsertQuery->execute($singleInsertData) === FALSE) { $this->_error = "Failed to perform a small-insert (whilst purging the remaining rows; the following errors occurred:".implode('<br/>', $this->_singleInsertQuery->errorInfo()); return false; } $this->_currentlyInsertingCount--; } } public function getError() { return $this->_error; } }
-
==============================
9.
codeigniter의 삽입 배치를 사용하여 여러 행의 데이터를 삽입하십시오.
$this->db->insert_batch('tabname',$data_array); // $data_array holds the value to be inserted
-
==============================
10.
당신은 codeigniter에서 여러 가지 방법으로 그것을 할 수 있습니다.
foreach($myarray as $row) { $data = array("first"=>$row->first,"second"=>$row->sec); $this->db->insert('table_name',$data); }
$data = array( array( 'first' => $myarray[0]['first'] , 'second' => $myarray[0]['sec'], ), array( 'first' => $myarray[1]['first'] , 'second' => $myarray[1]['sec'], ), ); $this->db->insert_batch('table_name', $data);
$sql = array(); foreach( $myarray as $row ) { $sql[] = '("'.mysql_real_escape_string($row['first']).'", '.$row['sec'].')'; } mysql_query('INSERT INTO table (first, second) VALUES '.implode(',', $sql));
-
==============================
11.
나는 당신이 쉽게 사용할 수있는이 간단한 기능을 만들었습니다. 삽입 데이터, 데이터 배열 ($ arr)에 대해 table-name ($ tbl), table-field ($ insertFieldsArr)를 전달해야합니다.
insert_batch('table',array('field1','field2'),$dataArray); function insert_batch($tbl,$insertFieldsArr,$arr){ $sql = array(); foreach( $arr as $row ) { $strVals=''; $cnt=0; foreach($insertFieldsArr as $key=>$val){ if(is_array($row)){ $strVals.="'".mysql_real_escape_string($row[$cnt]).'\','; } else{ $strVals.="'".mysql_real_escape_string($row).'\','; } $cnt++; } $strVals=rtrim($strVals,','); $sql[] = '('.$strVals.')'; } $fields=implode(',',$insertFieldsArr); mysql_query('INSERT INTO `'.$tbl.'` ('.$fields.') VALUES '.implode(',', $sql)); }
-
==============================
12.
이 질문에 답하기에는 너무 늦었지만. 여기에 내 대답은 똑같습니다.
CodeIgniter를 사용한다면 query_builder 클래스에 정의 된 inbuilt 메소드를 사용할 수 있습니다.
$ this-> db-> insert_batch ()
제공 한 데이터를 기반으로 삽입 문자열을 생성하고 쿼리를 실행합니다. 함수에 배열이나 객체를 전달할 수 있습니다. 다음은 배열을 사용하는 예제입니다.
$data = array( array( 'title' => 'My title', 'name' => 'My Name', 'date' => 'My date' ), array( 'title' => 'Another title', 'name' => 'Another Name', 'date' => 'Another date' )
);
$this->db->insert_batch('mytable', $data); // Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')
첫 번째 매개 변수는 테이블 이름을 포함하고 두 번째 매개 변수는 값의 연관 배열입니다.
query_builder에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
-
==============================
13.
use this in codeigniter for multiple data insertion $data = array( array( 'title' => 'My title' , 'name' => 'My Name' , 'date' => 'My date' ), array( 'title' => 'Another title' , 'name' => 'Another Name' , 'date' => 'Another date' ) ); $this->db->insert_batch('mytable', $data); // Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')
from https://stackoverflow.com/questions/779986/insert-multiple-rows-via-a-php-array-into-mysql by cc-by-sa and MIT lisence
'PHP' 카테고리의 다른 글
PHP - 디버깅 컬 (0) | 2018.09.04 |
---|---|
정수와 같은 이름을 가진 객체 속성에 액세스하는 방법? (0) | 2018.09.04 |
PHP를 사용하여 html에서 img src, title 및 alt를 추출하는 방법은 무엇입니까? (0) | 2018.09.04 |
PHP를위한 최상의 XML 파서 [duplicate] (0) | 2018.09.04 |
PHP에서 배열을 어떻게 다시 색인합니까? (0) | 2018.09.04 |