Din sql-fråga överskrider förmodligen max_allowed_packet
a> storlek i vilket fall servern kopplas från.
Du kanske är intresserad av mysqli_stmt ::send_long_data
som låter dig skicka parametrar längre än max_allowed_packet i bitar.
Uppdatering:"Hur kan jag ändra det? Är det enda alternativet att använda mysqli?"
Afaik kan värdet inte ändras på en per-session-bas, d.v.s. om du inte kan ändra serverkonfigurationen (my.cnf eller startparametrar) kommer värdet att vara skrivskyddat. edit:Som kommentaren antyder kan du ändra det globala värdet för mysql-servern efter att den har startats om du har de rätta behörigheterna
.PDO/PDO_MYSQL (från och med phpversion 5.3.0) verkar inte för att stödja send_long_data, men jag är inte säker på det heller. Det skulle lämna mysqli
som enda alternativet. Jag har nyligen märkt att Wez Furlong
sammanfogat stackspill. Eftersom han är en av författarna till PDO-implementeringen kanske han känner till (även om han inte skrev pdo_mysql modul).
(Helt oprövat och fult) exempel
// $mysqli = new mysqli(....
$fp = fopen($_FILES['binFile']['tmp_name'], 'rb') or die('!fopen');
//$result = $mysqli->query('SELECT @@max_allowed_packet') or die($mysqli->error);
//$chunkSize = $result->fetch_all();
//$chunkSize = $maxsize[0][0];
$chunkSize = 262144; // 256k chunks
$stmt = $mysqli->prepare('INSERT INTO foo (desc, bindata) VALUES (?,?)') or die($mysqli->error);
// silently truncate the description to 8k
$desc = 8192 < strlen($_POST['txtDescription']) ? $_POST['txtDescription'] : substr($_POST['txtDescription'], 0, 8192);
$stmt->bind_param('sb', $desc, null);
while(!feof($fp)) {
$chunk = fread($fp, $chunkSize);
$stmt->send_long_data(1, $chunk) or die('!send_long_data.'.$stmt->error);
}
$result = $stmt->execute();