sql >> Databasteknik >  >> RDS >> Mysql

Problem med uppladdningsstorlek i PHP och MySql

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


  1. mysql show Antal rader från andra tabeller i varje rad

  2. GROUP_CONCAT BESTÄLLNING AV

  3. Hur MINUTE() fungerar i MariaDB

  4. SQLSTATE[HY093]:Ogiltigt parameternummer:parametern har inte definierats