waarde toevoegen aan waarde
Ik ben bezig met een script waarmee ik bestanden in mysql opsla gemaakt met een speciale engine die daarvoor ontwikkeld is. Enige probleem dat ik nu heb is dat in mysql de max_packet_size 1mb is en de host dat ook niet (terecht) wil veranderen. Dit limiteert uploads tot 1mb dus vraag ik me af of het mogelijk is om de bestanden te splitten en dan naar mysql te sturen. Splitten lukt wel maar aan elkaar plakken niet meer. Is er een optie om een nieuwe waarde aan een bestaande waarde toe te voegen netals .= bij php?
Groetjes
Bram
UPDATE tabel SET colum = colum+1 WHERE colum = colum2
Gewijzigd op 01/01/1970 01:00:00 door Yearupie Achternaamloos
Schrijven:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$resource = fopen($path, 'r');
while(false !== $chunk = fread($resource, 2^20)) {
$name = mysql_real_escape_string($path);
$chunk = mysql_real_escape_string($chunk);
$sql = 'INSERT INTO files (file_name, data) VALUES ("'.$name.'","'.$chunk.'"')';
mysql_query($sql);
}
fclose($resource);
?>
$resource = fopen($path, 'r');
while(false !== $chunk = fread($resource, 2^20)) {
$name = mysql_real_escape_string($path);
$chunk = mysql_real_escape_string($chunk);
$sql = 'INSERT INTO files (file_name, data) VALUES ("'.$name.'","'.$chunk.'"')';
mysql_query($sql);
}
fclose($resource);
?>
Lezen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$resource = fopen($path, 'w');
$path = mysql_real_escape_string($path);
$sql = 'SELECT id FROM files WHERE file_name = "'.$path.'"';
$array = mysql_fetch_assoc(mysql_query($sql));
foreach($array as $part) {
$id = $part['id'];
$sql = 'SELECT data FROM files WHERE file_id= "'.$id.'"';
$chunk_array = mysql_fetch_assoc(mysql_query($sql));
$chunk = $chunk_array['data'];
fwrite($resource, $chunk);
}
fclose($resource);
?>
$resource = fopen($path, 'w');
$path = mysql_real_escape_string($path);
$sql = 'SELECT id FROM files WHERE file_name = "'.$path.'"';
$array = mysql_fetch_assoc(mysql_query($sql));
foreach($array as $part) {
$id = $part['id'];
$sql = 'SELECT data FROM files WHERE file_id= "'.$id.'"';
$chunk_array = mysql_fetch_assoc(mysql_query($sql));
$chunk = $chunk_array['data'];
fwrite($resource, $chunk);
}
fclose($resource);
?>
Uiteraard eigenlijk mysqli/pdo gebruiken. Fout afhandeling mag je zelf doen. Niet getest, dus er kunnen fouten in zitten.
EDIT: Stefan's oplossing is wel handiger. Iig als het uitlezen ook goed gaat.
EDIT 2: Gebruik daarvoor sql's substr functie:
SELECT SUBSTR(data, 0, 1048575)
FROM files
WHERE file_name = '...';
En dan
SELECT SUBSTR(data, 1048576, 2097152)
FROM files
WHERE file_name = '...';
enz
Gewijzigd op 01/01/1970 01:00:00 door Pim -
Bedankt!! Pim's oplossing lijkt me de beste en ga ik proberen. Stefan en Yearupie's idee had ik al geprobeerd maar de + werkt alleen om getallen op te tellen, niet om dingen aan mekaar te plakken ;)
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$sql = 'SELECT data FROM files WHERE file_name = "'.mysql_real_escape($path).'" ORDER BY id ASC';
$array = mysql_fetch_assoc(mysql_query($sql));
$data = '';
foreach($array as $part) {
$data .= $part['data'];
}
file_put_contents($path, $data);
?>
$sql = 'SELECT data FROM files WHERE file_name = "'.mysql_real_escape($path).'" ORDER BY id ASC';
$array = mysql_fetch_assoc(mysql_query($sql));
$data = '';
foreach($array as $part) {
$data .= $part['data'];
}
file_put_contents($path, $data);
?>
In de documentatie staat dat fread nl. maar max 8192 bytes tegelijk kan lezen, te weinig.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
//splitten en erin zetten
$fp = fopen($_FILES[$files]['tmp_name'], 'r'); //filepointer openen
for($i = 1; $content = fread($fp, 1000 * 1000); $i++) //uitlezen
{
//filteren en uploaden
$content = mysql_real_escape_string($content); //rare dingen deruit vissen
mysql_query("INSERT INTO files_chunks (file_id,chunk_id,data) VALUES ('".$insertid."','".$i."','".$content."')")
or die ("Mysql error: ".mysql_error());
//kijken of de loop niet doorgaat terwijl ie al klaar is
$stream_meta_data = stream_get_meta_data($fp);
if($stream_meta_data['unread_bytes'] <= 0) break;
}
?>
//splitten en erin zetten
$fp = fopen($_FILES[$files]['tmp_name'], 'r'); //filepointer openen
for($i = 1; $content = fread($fp, 1000 * 1000); $i++) //uitlezen
{
//filteren en uploaden
$content = mysql_real_escape_string($content); //rare dingen deruit vissen
mysql_query("INSERT INTO files_chunks (file_id,chunk_id,data) VALUES ('".$insertid."','".$i."','".$content."')")
or die ("Mysql error: ".mysql_error());
//kijken of de loop niet doorgaat terwijl ie al klaar is
$stream_meta_data = stream_get_meta_data($fp);
if($stream_meta_data['unread_bytes'] <= 0) break;
}
?>
Ik heb nu deze code, probleem is echter dat ie na 2 chunks stopt. Ik heb tevens de manier op om de loop te stoppen aangepast want het blijkt dat hij soms toch doorging ook al was $content leeg.. Als ik deze check uitzet blijft hij oneindig lang doorgaan met pakketjes van 0 bytes naar mysql te sturen. Iemand?