[PHP] Tekst uit array toevoegen aan MySQL database

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Ik ben bezig een fotoalbum aan het maken in PHP waarmee ik op eenvoudige wijze foto's kan toevoegen. De foto's worden weergegeven met behulp van Lightbox. Het weergeven van de foto's is geen probleem, maar nu wil ik een titel toevoegen aan de foto's zodat de titel als onderschrift wordt getoond in mijn Lightbox fotoalbum.

Om aan elke foto een eigen titel toe te voegen ben ik van plan om alle bestandsnamen van de foto's uit de directory in de database te zetten met daarbij een veld genaamd titel. Nu heb ik het volgende script in elkaar gezet:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function getPictures() {
    $files = array();
    
    if ($handle = opendir('pictures')) {
        while(($file = readdir($handle))!== false) {
            if ($file != "." && $file != "..") {
                $files[] = $file;
            }
        }
    }
    
    closedir($handle);  
    sort($files);
    
    foreach($files as $filename) {
        if(!preg_match("/thumb_/", $filename)) {
            mysql_query("INSERT INTO pictures (filename) VALUES('".$filename."');");        
            echo "<a href=\"pictures/".$filename."\" rel=\"lightbox[iceland]\" title=\"KOMT_NOG\"><img src=\"pictures/thumb_".$filename."\" width=\"99\" height=\"75\" alt=\"\" /></a>&nbsp;\n";
        } 
    }
}


Steeds wanneer ik dit script run wordt alleen de bestandsnaam van de 1e foto in de directory in de database gezet. Wie ziet waarom de bestandsnamen van de overige foto's niet in de MySQL database worden gezet?

Acties:
  • 0 Henk 'm!

Verwijderd

Je loopt te prutsen met 2 directory handles ($directory en $handle).
Je escapet de $filename niet in SQL query of de HTML code.
Je hebt geen enkele error-checking code.

Als je dat nou eerst eens gaat herstellen, zien we daarna wel weer verder.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Standaard debugging: Bekijk de inhoud van $files door bijvoorbeeld var_dump($files) vlak voor de foreach neer te zetten, bekijk de letterlijk uitgevoerde queries, controleer de return value van mysql_query (geldt eigenlijk voor alle system / db calls), etc. etc.

Overigens kan op regel 5 op $directory een check plaatsvinden, ipv een 2e keer opendir te doen naar een verder ongebruikte variabele. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Die 2 directory handles was ik inderdaad nog vergeten weg te halen, maar dat had verder geen invloed op de uitvoer van het script. De inhoud van de array bestaat uit:
PHP:
1
2
3
4
5
6
array(4) {
    [0]=>  string(18) "afbeelding (1).jpg"
    [1]=>  string(18) "afbeelding (2).jpg"
    [2]=>  string(24) "thumb_afbeelding (1).jpg"
    [3]=>  string(24) "thumb_afbeelding (2).jpg"
}


De twee afbeeldingen worden dus ook gewoon netjes getoond, maar alleen "afbeelding (1).jpg" komt in de database.

Acties:
  • 0 Henk 'm!

Verwijderd

En waar is je error-checking nou? Waar controleer je of de queries wel zijn gelukt? Waar bekijk je welke queries exact worden uitgevoerd?

Acties:
  • 0 Henk 'm!

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Probleem gevonden:
Ik was vergeten om het veld id in de database de waarde "auto_increment" mee te geven |:( |:( .

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
En als je dus de return value had gecontroleerd en indien niet goed echo mysql_error(); gedaan had, had je dit in 5 seconden gevonden.

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Voutloos schreef op zaterdag 12 juli 2008 @ 17:26:
En als je dus de return value had gecontroleerd en indien niet goed echo mysql_error(); gedaan had, had je dit in 5 seconden gevonden.
En daarom moeten ook beginners gewoon eens stoppen met de mysql_* functies aanroepen, en direct met libraries aan de gang gaan die allerlei fuckups voorkomen :)

Acties:
  • 0 Henk 'm!

  • Niekk
  • Registratie: September 2007
  • Laatst online: 12-04-2021

Niekk

Human-readable is relatief

sowiso moet je enige vorm van fout afhandeling doen. Maar zet nooit de MySQL error op het scherm van de 'klant'.
Dus doe iets van zoiets:
PHP:
1
2
3
4
5
6
7
<?php
$res = mysql_query($sql); // Zet de sql in een aparte variabele, dat is makkelijk
if(!$res) {
    echo "Er is intern iets mis gegaan, sorry voor het ongemak"; // eventueel hier een die() van maken
    log_gebeurtenis_of_mail_oid("Error bij ".$_SERVER['PHP_SELF'].":".__LINE__."\nDe fout was: ".mysql_error()."  , terwijl de SQL was: ".$sql."\n");
}
?>


Persoonlijk doe ik het zo. Nu zou je denken aan die "LINE" heb je niets omdat dat niet dezelfde lijn is als waar de SQL mis gaat, maar zo weet je wel welke SQL het was, omdat je in 1 script al snel meerdere SQL dingen hebt.

Edit:
Trouwens, je was ook vergeten je dingen te escapen. zie php.net

[ Voor 7% gewijzigd door Niekk op 12-07-2008 17:49 ]


Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

ik ben enorm verliefd op de directory-iterator:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

$files = array();

$items = new DirectoryIterator( 'pictures' );

foreach ( $items as $item )
{
    if ( $item->isFile() )
    {
        $files[] = $item->getFileName();
    }
}

$string = "('" . implode("'),('", $files) . "')";

$query = 'INSERT INTO pictures (filename) VALUES' . $string;

mysql_query( $query );

?>


spulleke toch? waardeer! ;) :D

Aunt bunny is coming to get me!


Acties:
  • 0 Henk 'm!

Verwijderd

Weer iemand die niet escapet :|

Acties:
  • 0 Henk 'm!

  • Niekk
  • Registratie: September 2007
  • Laatst online: 12-04-2021

Niekk

Human-readable is relatief

Inderdaad,
en waarom zo ingewikkeld die query opbouwen als ik vragen mag ? Je checkt tevens niet op fouten, zie mijn post hierboven.

Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

ik wilde alleen even laten zien dat zoiets mooier lukt met die iterator en maar met één query. ja geen foutafhandeling, geen escaping. ander onderwerp vind ik, daar ging het me hier even niet om. er wordt ook nog gebruik gemaakt van mysql ipv mysqli of beter nog PDO. ook zoiets. maar goed. als je dan toch mensen foutafhandeling wil leren oid dan maak meteen mooi gebruik van exceptions ipv hoe Niekk het hier demonstreert.

wat is er vreemd aan die queryopbouw trouwens?

[ Voor 23% gewijzigd door iH8 op 12-07-2008 23:03 ]

Aunt bunny is coming to get me!


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Nee, dat is geen ander onderwerp. Code voorbeelden worden 9 vd 10 klakkeloos overgenomen. Ja, de persoon die het zomaar copy paste is stom bezig, maar als dit geen perfecte code afhaalbalie is, moet je ook niet compleet werkende code (voor wat betreft de oppervlakkige vraag in een ts) voorkauwen.
Verwijderd schreef op zaterdag 12 juli 2008 @ 17:41:
[...]

En daarom moeten ook beginners gewoon eens stoppen met de mysql_* functies aanroepen, en direct met libraries aan de gang gaan die allerlei fuckups voorkomen :)
Waar, en zelfs een beginner kan een eenvoudige functie om mysql_query schrijven welke in ieder geval fouten logt. Maar gewoon het eenvoudige regeltje 'controleer return values van system calls' moet er hoe dan ook bij iedereen in zitten. :)

[ Voor 46% gewijzigd door Voutloos op 13-07-2008 11:07 ]

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Voutloos schreef op zondag 13 juli 2008 @ 11:06:
Nee, dat is geen ander onderwerp. Code voorbeelden worden 9 vd 10 klakkeloos overgenomen. Ja, de persoon die het zomaar copy paste is stom bezig, maar als dit geen perfecte code afhaalbalie is, moet je ook niet compleet werkende code (voor wat betreft de oppervlakkige vraag in een ts) voorkauwen.
Zoiets inderdaad. Het hoeft natuurlijk geen enterprise code te zijn, maar er mag best duidelijk worden gemaakt waar iemand iets moet escapen of wanneer een waarschuwing gegeven moet worden. De code uit de topicstart is letterlijk gec/p't uit live code. Dat is verontrustend. Er is dus alle reden om aan te nemen dat voorbeelden 1 op 1 worden gekoppiepasta't.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Niekk schreef op zaterdag 12 juli 2008 @ 17:46:
sowiso moet je enige vorm van fout afhandeling doen. Maar zet nooit de MySQL error op het scherm van de 'klant'.
Dus doe iets van zoiets:
PHP:
1
2
3
4
5
6
7
<?php
$res = mysql_query($sql); // Zet de sql in een aparte variabele, dat is makkelijk
if(!$res) {
    echo "Er is intern iets mis gegaan, sorry voor het ongemak"; // eventueel hier een die() van maken
    log_gebeurtenis_of_mail_oid("Error bij ".$_SERVER['PHP_SELF'].":".__LINE__."\nDe fout was: ".mysql_error()."  , terwijl de SQL was: ".$sql."\n");
}
?>

Persoonlijk doe ik het zo.
Vind je dat niet een beetje veel code voor iedere query? Je kunt het beter in een klasse gooien die je bij elk project kunt hergebruiken. Met debug_backtrace kun je ook dan de regel achterhalen met de query die fout gaat.
Voutloos schreef op zondag 13 juli 2008 @ 11:25:
De code van Niekk kan prima in een functie staan. ;)
Kan wel ja, maar __LINE__ kun je dan niet gebruiken op de manier die hij in het laatste deel van zijn post beschrijft.

[ Voor 14% gewijzigd door GlowMouse op 13-07-2008 11:42 ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
De code van Niekk kan prima in een functie staan. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • Niekk
  • Registratie: September 2007
  • Laatst online: 12-04-2021

Niekk

Human-readable is relatief

GlowMouse schreef op zondag 13 juli 2008 @ 11:20:
[...]

Vind je dat niet een beetje veel code voor iedere query? Je kunt het beter in een klasse gooien die je bij elk project kunt hergebruiken. Met debug_backtrace kun je ook dan de regel achterhalen met de query die fout gaat.
Dit is inderdaad veel code. Maar zo voorkom je wel fouten. Ik "geef toe" dat als ik het zelf gebruik, ik er een functie of class voor maak. (Heb ik thuis nog wel liggen trouwens).

Acties:
  • 0 Henk 'm!

  • g4wx3
  • Registratie: April 2007
  • Laatst online: 11-09 09:49
ik ben hier een classe begonnen. hij is in 'alfa'-fase, maar je kunt ze zeker wel al gebruiken.

Ik post ze onder GPL, als je ze gebruikt post dan de verbeteringen in dit topic.
Daarbij weet ik niet op welke server dit definitief gaat draaien (PHP4 of hopelijk 5)
Er staan ook wat overbodige methods in, maar ik heb ze blijkbaar ergens in mijn script wel in gebruik, en ben nog niet aan het optimaliseren, alles is in alfa-fase nog.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
class DBI
{
    var $_message;      # BOOL: switch erros message | error number
    var $_status;       # int|string: status of connection

    var $_server;       # string: server
    var $_username;     # string: username
    var $_password;     # string: password
    var $_database;     # string: database name

    var $_link;         # Recource: database connection
    var $_link_database;# Recource: database link
    var $_query;        # string: Last query
    var $_result;       # Recource: last query result pointer
    var $_query_result; # Array: Last fetched result
    # PHP 5 shortcuts
    function __construct($server=NULL,$username=NULL,$password=NULL,$database=NULL)
    {
        $this->DBI($server,$username,$password,$database);
    }
    function __destruct()
    {
        $this->close();
        unset($this);
    }
    # the real thing
    function DBI($server=NULL,$username=NULL,$password=NULL,$database=NULL)
    {
        $this->_server = $server;
        $this->_username = $username;
        $this->_password = $password;
        $this->_database = $database;
        $this->_message = false;
        $this->_result = true;
        return $this->connect();
    }
    function connect()
    {
        $this->_link = @mysqli_connect($this->_server,$this->_username,$this->_password);
        $this->_link_database = @mysqli_select_db($this->_link,$this->_database);
        return $this->_link;
    }
    function query($query)
    {
        $this->_query = $query;
        $this->_result = @mysqli_query($this->_link, $query);
        return $this->_result;
    }
    function fetch($optimize=true)
    {
        $this->_query_result = array();
        while ($row = @mysqli_fetch_assoc($this->_result))
        {
            $this->_query_result[] = $row;
        }
        if($optimize && count($this->_query_result)==1)         # BackwardCompatibility
            $this->_query_result = $this->_query_result[0];
        return $this->_query_result;
    }
    function close()
    {
        @mysqli_close($this->_link);
    }
    # Switch output: error number|error message
    function set_message($bool)                             # BackwardCompatibility
    {
         $this->_message=$bool;
    }
    # STATUS MESSAGES
    function status($message=NULL)
    {
        if($message==NULL) $message=$this->_message;
        switch(false)
        {
            case !empty($this->_server):
                $this->_status = 0;
                if($message) $this->_status .= ': false positive: missing server atribute'."\r\n";
            break;
            case !empty($this->_username):
            case !empty($this->_password):
                $this->_status = 2;
                if($message) $this->_status .= ': authentification required'."\r\n";
            break;
            case ($this->_link):
                $this->_status = 3;
                if($message) $this->_status .= ': wrong password or username'."\r\n";
            break;
            case ($this->_link_database):
                $this->_status = 4;
                if($message) $this->_status .= ': database not found'."\r\n";
            break;
            case true:
                $this->_status = 5;
                if($message)  $this->_status .= ': table not found'."\r\n";
            break;
            case ($this->_result):
                $this->_status = 6;
                if($message)  $this->_status .= ': Error query: \''.$this->_query."'\r\n";
            break;
            default:
                $this->_status = 7;
                if($message) $this->_status .= ': fully up and running'."\r\n";
            break;
        }
        return $this->_status;
    }
}

http://www.softfocus.be/


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
g4wx3 schreef op zondag 13 juli 2008 @ 14:37:
Daarbij weet ik niet op welke server dit definitief gaat draaien (PHP4 of hopelijk 5)
Ik hoop versie 5, anders werkt mysqli niet. En als je weet dat je PHP5 gaat draaien, kun je de class wat tweaken: bij vars aangeven of ze public/private zijn, alleen __construct en __destruct gebruiken (de unset($this) is overbodig). Dingen die ontbreken zijn goede foutafhandeling, debugmogelijkheden (querytijd, explain), mogelijkheid om snel één veld (naast één rij dat er al inzit) op te halen, escaping.

Een switch(false) ziet er trouwens erg ongewoon uit, en dan ook nog de mogelijkheid 'case true' die getriggerd moet worden als een tabel niet gevonden wordt maakt het er niet begrijpelijker op. En is $message nou een boolean of mag hij ook NULL zijn? Dat hele status en setmessage zou ik eruit halen en door betere foutafhandeling vervangen.

Acties:
  • 0 Henk 'm!

  • Niekk
  • Registratie: September 2007
  • Laatst online: 12-04-2021

Niekk

Human-readable is relatief

leuke classe, maar ik vraag me alleen af waaorm je de errors pas doorgeeft als de programmeur daar om vraagt ?

Acties:
  • 0 Henk 'm!

  • g4wx3
  • Registratie: April 2007
  • Laatst online: 11-09 09:49
hmm, ik moet inderdaad nog heel wat tijd steken inde classe voor die af is. De reden dat ik bij een foutmelding soms alleen een nummer doorgeef, is omdat aan de hand daarvan een functie kan beslissen om eerst een tabel te maken, of de database te configureren.
Dat is ook de reden dat ik m'n eigen classe ben begonnen, er zijn er genoeg te vinden op internet, maar ik wilde een speciale foutafhandeling.
Dat is dan weer de reden dat status = 1 niet bestaat, hij bestond wel maar ik heb hem verwijdert omdat ik iets goed fout had gemaakt. Ondertussen had ik wel al heel wat functies die afhangen van het error-nummer, dus heb ik het zo gelaten.
En case true snap ik ook niet, wss zal ik die vermelding tijdelijk hebben willen uitschakkelen, en ben ik het daarna vergeten, of moet ik nog iets verzinnen.

Anyway, Het is alfa, en het is GPL, niet zonder toeval.

BTW: Sowiso ben ik van plan om de classe vooral nog uit te breiden met uitgebreide SELECT/UPDATE/DELETE methodes.
Eerst wil ik men programma wat meer afmaken, zodanig ik kan zien wat er zoal moet instaan.

[ Voor 26% gewijzigd door g4wx3 op 13-07-2008 23:10 ]

http://www.softfocus.be/


Acties:
  • 0 Henk 'm!

Verwijderd

g4wx3 schreef op zondag 13 juli 2008 @ 23:06:

Anyway, Het is alfa, en het is GPL, niet zonder toeval.
Doe jezelf en de rest van de wereld een gunst, en publiceer de code niet onder de GPL. Publiceer je code gewoon niet.

Je class heet "DBI", wat op zich al veel te onduidelijk is, en roept mysqli functies aan. Waarom zit er dan geen mysql/Mysql/MySQL in de naam?

Kijk gewoon eens naar het Zend Framework. Dat scheelt je een hoop ellende. Misschien is het schrijven van zo'n class voor jou erg leerzaam, de rest van de wereld zit niet op nog meer bende te wachten. Het is al erg genoeg dat websites als phpfreakz.nl bestaan.

En echt... in de constructor al met de MySQL server connecten, een resultaat als property van je object opslaan, hoe verzin je het allemaal...

Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

Voutloos schreef op zondag 13 juli 2008 @ 11:06:
Nee, dat is geen ander onderwerp. Code voorbeelden worden 9 vd 10 klakkeloos overgenomen. Ja, de persoon die het zomaar copy paste is stom bezig, maar als dit geen perfecte code afhaalbalie is, moet je ook niet compleet werkende code (voor wat betreft de oppervlakkige vraag in een ts) voorkauwen.
als niemand een stukje fatsoenlijke code voorklopt dan komt nooit niemand er. voorbeelden heeft iedereen nodig gehad, ook jij en ik. als mensen dingen klakkeloos overnemen dan is dan hun eigen domme fout. ik had er nog bijna nog $mysqli->set_charset('utf8'); in laten staan. laat 'm het copy/pasten en nieuwe topic aanmaken: "krijg op rare plaatsen rare characters". het laatste wat ik wil is mensen hapklare brok voorzetten. maar toch:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
try
{
    $mysqli = @ new mysqli( 'localhost', 'user', 'password', 'database' );

    if ( mysqli_connect_errno() )
    {
        throw new Exception( mysqli_connect_errno() . ' - ' . mysqli_connect_error() );
    }

    $files = array();
    $items = new DirectoryIterator( 'pictures' );

    foreach ( $items as $item )
    {
        if ( $item->isFile() )
        {
            $files[] = $mysqli->real_escape_string( $item->getFileName() );
        }
    }
    
    $string = "('" . implode( "'),('", $files ) . "')";
    $query = 'INSERT INTO pictures (filename) VALUES' . $string;
    
    if ( !$mysqli->query( $query ) )
    {
        throw new Exception( $mysqli->errno . ' - ' . $mysqli->error );
    }
}

catch (Exception $error)
{
    echo  $error->getMessage();
}


>:) :P :D daar dan incl. foutafhandeling en escaping. (niet getest) nu weet ik nog niet wat er zo mis is aan m'n queryopbouw...

Aunt bunny is coming to get me!


Acties:
  • 0 Henk 'm!

Verwijderd

iH8 schreef op maandag 14 juli 2008 @ 03:38:
[...]

>:) :P :D daar dan incl. foutafhandeling en escaping. (niet getest) nu weet ik nog niet wat er zo mis is aan m'n queryopbouw...
Edit: Doh, het is nog vroeg :) had gewoon eroverheen gelezen. Ik ga maar even een Red Bull erbij pakken.

[ Voor 27% gewijzigd door Verwijderd op 14-07-2008 11:03 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op maandag 14 juli 2008 @ 10:13:

wat als een filename een komma bevat? dan loopt je query de soep in.
Dit is zo mogelijk de domste opmerking van het jaar in Programming.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
iH8 schreef op maandag 14 juli 2008 @ 03:38:
als niemand een stukje fatsoenlijke code voorklopt dan komt nooit niemand er. voorbeelden heeft iedereen nodig gehad, ook jij en ik.
Nee dank je, ik heb dit soort voorbeelden niet nodig. Wel zie ik graag specieke voorbeelden, binnen een specifieke context (zoals bijv. de PHP manual is opgezet). Hier had enkel je hint als "Kijk eens naar de DirectoryIterator om eenvoudig een array van file names te krijgen" net zo nuttig, of misschien zelfs beter geweest.
het laatste wat ik wil is mensen hapklare brok voorzetten. maar toch
Doe het dan ook niet. :> Je vind het misschien wel leuk om deze lap code te delen en je hebt er best wat tijd in gestoken, maar eigenlijk schiet niemand er verder wat mee op. Ja, het script is zo een stuk completer, maar qua design en continu low level bezig zijn is het verre van de perfecte leidraad, en offtopic. Puur door het voorkauwen, haal je je ook allemaal extra problemen op de hals en ook daarom is gewoon een hint/pointer geven hoe een bepaald probleem op te lossen veel beter. Als je het schrijven van het complete script leuk vind, moet je zorgen dat ts je inhuurt. :P
Verwijderd schreef op maandag 14 juli 2008 @ 10:13:
[...]
wat als een filename een komma bevat? dan loopt je query de soep in.
Dus is het onmogelijk om in een (var)char kolom een string welke een komma bevat op te slaan? ;) Die komma staat gewoon binnen een quoted string. Dan blijft het enige probleem het vernaggelen van de query opbouw dmv quotes, maar dat kan niet dankzij de escaping. :)

{signature}


Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

Voutloos schreef op maandag 14 juli 2008 @ 10:29:

Nee dank je, ik heb dit soort voorbeelden niet nodig. Wel zie ik graag specieke voorbeelden, binnen een specifieke context (zoals bijv. de PHP manual is opgezet). Hier had enkel je hint als "Kijk eens naar de DirectoryIterator om eenvoudig een array van file names te krijgen" net zo nuttig, of misschien zelfs beter geweest.

Doe het dan ook niet. :> Je vind het misschien wel leuk om deze lap code te delen en je hebt er best wat tijd in gestoken, maar eigenlijk schiet niemand er verder wat mee op. Ja, het script is zo een stuk completer, maar qua design en continu low level bezig zijn is het verre van de perfecte leidraad, en offtopic. Puur door het voorkauwen, haal je je ook allemaal extra problemen op de hals en ook daarom is gewoon een hint/pointer geven hoe een bepaald probleem op te lossen veel beter. Als je het schrijven van het complete script leuk vind, moet je zorgen dat ts je inhuurt. :P
point taken :) ik verveelde mezelf intens. hehe. scripter nodig anyone? ;)

Aunt bunny is coming to get me!


Acties:
  • 0 Henk 'm!

  • Niekk
  • Registratie: September 2007
  • Laatst online: 12-04-2021

Niekk

Human-readable is relatief

iH8 schreef op maandag 14 juli 2008 @ 03:38:
[...]


als niemand een stukje fatsoenlijke code voorklopt dan komt nooit niemand er. voorbeelden heeft iedereen nodig gehad, ook jij en ik. als mensen dingen klakkeloos overnemen dan is dan hun eigen domme fout. ik had er nog bijna nog $mysqli->set_charset('utf8'); in laten staan. laat 'm het copy/pasten en nieuwe topic aanmaken: "krijg op rare plaatsen rare characters". het laatste wat ik wil is mensen hapklare brok voorzetten. maar toch:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
try
{
    $mysqli = @ new mysqli( 'localhost', 'user', 'password', 'database' );

    if ( mysqli_connect_errno() )
    {
        throw new Exception( mysqli_connect_errno() . ' - ' . mysqli_connect_error() );
    }

    $files = array();
    $items = new DirectoryIterator( 'pictures' );

    foreach ( $items as $item )
    {
        if ( $item->isFile() )
        {
            $files[] = $mysqli->real_escape_string( $item->getFileName() );
        }
    }
    
    $string = "('" . implode( "'),('", $files ) . "')";
    $query = 'INSERT INTO pictures (filename) VALUES' . $string;
    
    if ( !$mysqli->query( $query ) )
    {
        throw new Exception( $mysqli->errno . ' - ' . $mysqli->error );
    }
}

catch (Exception $error)
{
    echo  $error->getMessage();
}


>:) :P :D daar dan incl. foutafhandeling en escaping. (niet getest) nu weet ik nog niet wat er zo mis is aan m'n queryopbouw...
Misschien dat ik hier iets verkeerd lees, maar:
code:
1
2
    $string = "('" . implode( "'),('", $files ) . "')";
    $query = 'INSERT INTO pictures (filename) VALUES' . $string;

Daar gooi je dus meerdere VALUES voor 1 column ("filename") ?
Jou uiteindelijke query komt er dan toch uit te zien als:
code:
1
INSERT INTO pictures (filename) VALUES('bestand.png','anderbestand.jpg','etc.extensie')

Of lees/begrijp ik nu iets verkeerd ? :?
Daarom vond ik overigens je query opbouw eerder al 'raar'.

edit: Of kan je meerdere value's voor 1 column opgeven, en dan worden er meerdere rows toegevoegd in MySQL ? Heb ik zelf nog nooit gedaan namelijk, maar ik zie wel eens de fout voorbij komen: "Row and value count do not match" o.i.d.

Acties:
  • 0 Henk 'm!

Verwijderd

Niekk schreef op maandag 14 juli 2008 @ 11:51:
Jouw uiteindelijke query komt er dan toch uit te zien als:
code:
1
INSERT INTO pictures (filename) VALUES('bestand.png','anderbestand.jpg','etc.extensie')

Of lees/begrijp ik nu iets verkeerd ? :?
Ja.
code:
1
INSERT INTO pictures (filename) VALUES('bestand.png'),('anderbestand.jpg'),('etc.extensie')
Of kan je meerdere value's voor 1 column opgeven, en dan worden er meerdere rows toegevoegd in MySQL ? Heb ik zelf nog nooit gedaan namelijk, maar ik zie wel eens de fout voorbij komen: "Row and value count do not match" o.i.d.
Dat kun je natuurlijk het best even zelf bekijken in de Reference Manual

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
INSERT syntax :>

Let op dat er ook haakje bij ge-implode worden. Hier worden meerdere rows geinsert, wat op deze manier een stuk efficienter is dan een loop met een INSERT query per filename. ;)

edit:
Zo dan, dat is al de zoveelste gmta met Cheatah 8)7

[ Voor 11% gewijzigd door Voutloos op 14-07-2008 11:57 ]

{signature}


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Nee, het ziet er uiteindelijk zo uit:
code:
1
INSERT INTO pictures (filename) VALUES('bestand.png'), ('andersbestand.jpg'), ('foo.bar')

Kortom: er worden gewoon meerdere records tegelijk geinsert.

Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

Niekk schreef op maandag 14 juli 2008 @ 11:51:

Misschien dat ik hier iets verkeerd lees, maar:
code:
1
2
    $string = "('" . implode( "'),('", $files ) . "')";
    $query = 'INSERT INTO pictures (filename) VALUES' . $string;

Daar gooi je dus meerdere VALUES voor 1 column ("filename") ?
Jou uiteindelijke query komt er dan toch uit te zien als:
code:
1
INSERT INTO pictures (filename) VALUES('bestand.png','anderbestand.jpg','etc.extensie')

Of lees/begrijp ik nu iets verkeerd ? :?
Daarom vond ik overigens je query opbouw eerder al 'raar'.

edit: Of kan je meerdere value's voor 1 column opgeven, en dan worden er meerdere rows toegevoegd in MySQL ? Heb ik zelf nog nooit gedaan namelijk, maar ik zie wel eens de fout voorbij komen: "Row and value count do not match" o.i.d.
dat returned gewoon:

SQL:
1
INSERT INTO pictures (filename) VALUES ('file1,ext'),('file2.ext'),('file3.ext')


op die manier insert je gewoon multiple rows. mocht je meer columns hebben dan doe je zoiets:

SQL:
1
INSERT INTO table (column1,column2) VALUES ('value1a','value1b'),('value2a','value2b')


zo ej. sneller tiepen volgende keer :D

Aunt bunny is coming to get me!


Acties:
  • 0 Henk 'm!

  • Niekk
  • Registratie: September 2007
  • Laatst online: 12-04-2021

Niekk

Human-readable is relatief

ah, ik zag het laatste haakje sluiten niet :)
Pagina: 1