Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Problem z rozmiarem wysyłania w PHP i MySql

Twoje zapytanie sql prawdopodobnie przekracza max_allowed_packet size w takim przypadku serwer się rozłączy.
Może być zainteresowany mysqli_stmt ::send_long_data co pozwala na wysyłanie parametrów dłuższych niż max_allowed_packet w porcjach.

Aktualizacja:"Jak mogę to zmienić? Czy używanie mysqli jest jedyną opcją?"
Afaik tej wartości nie można zmienić na podstawie sesji, tj. jeśli nie można zmienić konfiguracji serwera (my.cnf lub parametry startowe) wartość będzie tylko do odczytu. edit:Jak sugeruje komentarz, możesz zmienić globalną wartość serwera mysql po jego uruchomieniu, jeśli masz odpowiednie uprawnienia .PDO/PDO_MYSQL (od wersji 5.3.0) nie wydaje się do obsługi send_long_data, ale tego też nie jestem pewien. To pozostawiłoby mysqli jako jedyna opcja. Niedawno zauważyłem, że Wez Furlong przepełnienie połączonego stosu. Ponieważ jest jednym z autorów implementacji PDO, może znać (chociaż nie napisał pdo_mysql moduł).

(Całkowicie nieprzetestowany i brzydki) przykład

// $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();


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie można wykonać procedury składowanej MySQL z Javy

  2. Jak skonfigurować encję (doktrynę) dla widoku bazy danych w Symfony 2?

  3. mysql_fetch_array pomijam pierwszy wiersz

  4. Jakiego typu/długości kolumny należy użyć do przechowywania zaszyfrowanego hasła Bcrypt w bazie danych?

  5. Jak dodać separator do połączonego ciągu w MySQL — CONCAT_WS()