In PHP, I pull a large amount of JSON data from a URI, then serialize it into an associative PHP array via the built-in json_decode function.
Then, I create an array:
$inserts = array();
I loop through the JSON associative array, adding a new key/value pair to my $inserts array for each item in the JSON array:
foreach($JSON_data as $key => $value) {
$inserts[] = "(".mysql_real_escape_string($value["prop1"]).","
.mysql_real_escape_string($value["prop2"]).","
.mysql_real_escape_string($value["prop3"]).")";
}
Then, I perform a bulk insert simply by imploding the inserts I already prepared:
mysql_query("INSERT INTO `MyTable` (`col1`,`col2`,`col3`) VALUES ".implode(",",$inserts));
Anyways, I found that the mysql_* family is no longer suggested to be used. So I’m wondering how this type of pattern is suppose to be accomplished using prepared statements or w/e the new accepted constructs are? My concerns are to eliminate SQL injection, and also to update MySQL as quickly as possible with fewer than 10 concurrent, open connections (preferably 1). Also, to keep things as simple and quick as possible.
Or, if there’s a new pattern or preferred method to perform such a bulk transaction.
If you use a prepared statement, you can loop over your
$JSON_dataarray with a foreach loop and run theINSERTwith that chunk of the data.Using prepared statements will reduce the overhead of building the query, simply sending the new data to the database on each iteration of the loop.
Note that the first argument to
bind_param()tells it how many values you will be binding, as well as the type for each value.scorresponds to string data,icorresponds to integer data,dcorresponds to double (floating point), andbcorresponds to binary data.One other word of caution, do NOT quote any string data, as the
sdatatype tells mysql to expect a string. If you quote the?in the prepared statement, it will tell you the number of params is wrong. If you quote the strings, it will be quoted in mysql.EDIT:
If you want to use the same paradigm (inserting multiple rows with one query), there are ways to do it. One way is to create a class that will aggregate the
bind_paramcalls and do one bind_param when you execute the query. Code for that is here.