Вашата sql заявка вероятно надвишава max_allowed_packet размер, в който случай сървърът ще прекъсне връзката.
Може да се интересувате от mysqli_stmt ::send_long_data
което ви позволява да изпращате параметри, по-дълги от max_allowed_packet на парчета.
Актуализация:"Как мога да го променя? Използването на mysqli е единствената опция?"
Afaik стойността не може да бъде променена на база на сесия, т.е. ако не можете да промените конфигурацията на сървъра (my.cnf или параметри за стартиране) стойността ще бъде само за четене. редактиране:Както подсказва коментарът, можете да промените глобалната стойност на mysql сървъра, след като е бил стартиран, ако имате правилните разрешения
.PDO/PDO_MYSQL (от phpversion 5.3.0) не изглежда за да поддържа send_long_data, но и за това не съм сигурен. Това ще остави mysqli
като единствен вариант. Наскоро забелязах, че Wez Furlong
присъединено препълване на стека. Тъй като той е един от авторите на реализацията на PDO, той може би знае (въпреки че не е написал pdo_mysql модул).
(Напълно непроверен и грозен) пример
// $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();