waarde toevoegen aan waarde

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bram Couteaux

Bram Couteaux

10/12/2009 17:30:00
Quote Anchor link
Hoi allemaal,

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
 
PHP hulp

PHP hulp

09/05/2024 00:17:16
 
Stefan

Stefan

10/12/2009 17:32:00
Quote Anchor link
UPDATE tabel SET colum = colum+1 WHERE colum = colum2
 
Yearupie Achternaamloos

Yearupie Achternaamloos

10/12/2009 17:33:00
Quote Anchor link
edit: sorry, zie hierboven
Gewijzigd op 01/01/1970 01:00:00 door Yearupie Achternaamloos
 
Pim -

Pim -

10/12/2009 17:48:00
Quote Anchor link
Je zou verschillende records per file kunnen gebruiken met elk dus 1mb data. Volgens mij kan dat zo:
Schrijven:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>


Lezen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>


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 -
 
Bram Couteaux

Bram Couteaux

10/12/2009 19:56:00
Quote Anchor link
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 ;)
 
Pim -

Pim -

10/12/2009 21:48:00
Quote Anchor link
Als het niet werkt kan je trouwens ook file_get_contents() gebruiken en dan chunk_split() ipv dat fread(). Gebruik dan ipv. fwrite()
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>

In de documentatie staat dat fread nl. maar max 8192 bytes tegelijk kan lezen, te weinig.
 
Bram Couteaux

Bram Couteaux

11/12/2009 11:21:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
        }

?>


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?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.