abonnement Unibet Coolblue Bitvavo
  donderdag 27 maart 2008 @ 17:04:37 #91
62215 qu63
..de tijd drinkt..
pi_57650767
quote:
Op donderdag 27 maart 2008 17:02 schreef ursel het volgende:

[..]

SELECT meldingen.*, user.naam FROM meldingen LEFT JOIN user where meldingen.van_id = user.id

De A en B zijn alleen maar voor korte notatie gebruik. Zeker als je maar een aantal velden getoont wilt hebben is het niet handig om elke keer meldingen ervoor te moeten zetten.
helaas niet

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where meldingen . van_id = user . id
LIMIT 0, 30' at line 1
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
  donderdag 27 maart 2008 @ 17:13:11 #92
63192 ursel
"Het Is Hier Fantastisch!
pi_57650927
quote:
Op donderdag 27 maart 2008 17:04 schreef qu63 het volgende:

[..]

helaas niet

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where meldingen . van_id = user . id
LIMIT 0, 30' at line 1
De punt is een koppel teken. Probeer het eens met de spaties ertussenuit.
  donderdag 27 maart 2008 @ 17:13:17 #93
187069 slacker_nl
Sicko pur sang
pi_57650932
select meldingen.*, user.name from meldingen, user where meldingen.van_id = user.id
In theory there is no difference between theory and practice. In practice there is.
  donderdag 27 maart 2008 @ 17:14:27 #94
62215 qu63
..de tijd drinkt..
pi_57650962
quote:
Op donderdag 27 maart 2008 17:13 schreef ursel het volgende:

[..]

De punt is een koppel teken. Probeer het eens met de spaties ertussenuit.
zo heb ik em ook ingeveord, phpmyadmin plakt de spties er tussen bij de foutmelding
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
  donderdag 27 maart 2008 @ 17:14:47 #95
187069 slacker_nl
Sicko pur sang
pi_57650968
en is het niet

FROM meldingen LEFT JOIN user ON meldingen.van_id = user.id
In theory there is no difference between theory and practice. In practice there is.
  donderdag 27 maart 2008 @ 17:20:14 #96
63192 ursel
"Het Is Hier Fantastisch!
pi_57651076
quote:
Op donderdag 27 maart 2008 17:14 schreef slacker_nl het volgende:
en is het niet

FROM meldingen LEFT JOIN user ON meldingen.van_id = user.id
Dat ook ja..
  donderdag 27 maart 2008 @ 17:20:42 #97
62215 qu63
..de tijd drinkt..
pi_57651082
quote:
Op donderdag 27 maart 2008 17:13 schreef slacker_nl het volgende:
select meldingen.*, user.name from meldingen, user where meldingen.van_id = user.id
zo krijg ik wel resultaten, maar dan ook alle resultaten. Ik wil juist alleen de meldingen laten zien voor deze gebruiker
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
  donderdag 27 maart 2008 @ 17:26:28 #98
62215 qu63
..de tijd drinkt..
pi_57651215
quote:
Op donderdag 27 maart 2008 17:14 schreef slacker_nl het volgende:
en is het niet

FROM meldingen LEFT JOIN user ON meldingen.van_id = user.id
hmz, nogniet helemaal

1
2
3
4
5
6
7
 id        van_id        voor_id        titel        inhoud        datum        gelezen        naam
1    1    2    Titel Ongelezen    Ongelezen    1206710100    1    Jantje
1    1    2    Titel Ongelezen    Ongelezen    1206710100    1    Hiephoi!
2    2    1    Titel Gelezen    Gelezen    1206710100    1    NULL
3    1    2    Titel Gelezen    Gelezen    1206621950    1    Jantje
3    1    2    Titel Gelezen    Gelezen    1206621950    1    Hiephoi!
4    2    1    Titel Ongelezen    Ongelezen    1206621950    0    NULL


terwijl dit alleen in mn database staat:
meldingen:
1
2
3
4
5
 id        van_id        voor_id        titel        inhoud        datum        gelezen
1     1     2     Titel Ongelezen     Ongelezen     1206710100     1
2     2     1     Titel Gelezen     Gelezen     1206710100     1
3     1     2     Titel Gelezen     Gelezen     1206621950     1
4     2     1     Titel Ongelezen     Ongelezen     1206621950     0

user
1
2
3
 id        naam        inlog        ww        email        sessid
1     Jantje     qu63     WEG     WEG     WEG
2     Hiephoi!     admin     WEG     WEG     WEG
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
  donderdag 27 maart 2008 @ 18:54:33 #99
62215 qu63
..de tijd drinkt..
pi_57653130
Ik snap er nog minder van nu -O-

sql-query:
1
2
3
4
5
6
<?php
$q 
"SELECT * FROM meldingen";
$res=mysql_query($q);
$berichten mysql_fetch_array($res);
print_r($berichten);
?>

Er staan 4 rijen in mn tabel, maar de enige output is dit:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Array
(
    [0] => 1
    [id] => 1
    [1] => 1
    [van_id] => 1
    [2] => 2
    [voor_id] => 2
    [3] => Titel Ongelezen
    [titel] => Titel Ongelezen
    [4] => Ongelezen
    [inhoud] => Ongelezen
    [5] => 1206710100
    [datum] => 1206710100
    [6] => 1
    [gelezen] => 1
)


Wat gaat er nou allemaal fout hier :?
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
pi_57653218
quote:
Op donderdag 27 maart 200817:03 schreef ursel het volgende:

[..]

Waarom dubbele DB verbinding als het in 1 query ook kan??
ja sorry, ik heb tot nu toe in mijn hele leven 3 query's gebouwd (de eerste eergisteren)
pi_57653496
quote:
Op donderdag 27 maart 2008 18:54 schreef qu63 het volgende:
Ik snap er nog minder van nu

sql-query:
[ code verwijderd ]

Er staan 4 rijen in mn tabel, maar de enige output is dit:
[ code verwijderd ]

Wat gaat er nou allemaal fout hier
Het haalt zowel de associatieve array op als de nummerieke. Je moet even specificeren welke wordt weergegeven

1
2
3
4
5
6
7
8
9
10
<?php
$q = "SELECT * FROM meldingen";
$res=mysql_query($q);
$i=0;
while($berichten = mysql_fetch_array($res))
 {
  print $berichten[$i];
  $i++;
 }
?>


Zo zou het wel moeten werken.
  donderdag 27 maart 2008 @ 19:13:39 #102
62215 qu63
..de tijd drinkt..
pi_57653626
quote:
Op donderdag 27 maart 2008 19:08 schreef beerten het volgende:

[..]

Het haalt zowel de associatieve array op als de nummerieke. Je moet even specificeren welke wordt weergegeven
[ code verwijderd ]

Zo zou het wel moeten werken.
Dan nog krijg ik maar 1 rij te zien.

En als ik mysql_fetch_array vervang door mysql_fetch_row krijg ik nog steeds 1 rij terug
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
pi_57653877
Hoe ziet je tabel er uit en wat wil je ophalen? Welke gegevens wil je?
Je haalt nu ALLES op, alle rijen, alle velden en kolommen. 2 keer zelfs zo te zien.
  donderdag 27 maart 2008 @ 19:48:04 #104
62215 qu63
..de tijd drinkt..
pi_57654716
quote:
Op donderdag 27 maart 2008 19:22 schreef beerten het volgende:
Hoe ziet je tabel er uit en wat wil je ophalen? Welke gegevens wil je?
Je haalt nu ALLES op, alle rijen, alle velden en kolommen. 2 keer zelfs zo te zien.
1
2
3
4
5
id        van_id        voor_id        titel        inhoud        datum        gelezen
1    1    2    Titel Ongelezen    Ongelezen    1206710100    1
2    2    1    Titel Gelezen    Gelezen    1206710100    1
3    1    2    Titel Gelezen    Gelezen    1206621950    1
4    2    1    Titel Ongelezen    Ongelezen    1206621950    0

dat is de inhoud van de tabel 'meldingen', en die wil ik gewoon in een keer neerplempen. Tot nu toe poept ie alleen de eerste rij er uit -O-
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
  donderdag 27 maart 2008 @ 20:07:39 #105
32768 DionysuZ
Respect my authority!
pi_57655396
Natuurlijk krijg je maar 1 rij terug. Om meerdere rijen terug te krijgen moet je, zoals hierboven ergens ook staat, er een while loopje van maken.
□ Reality is merely an illusion,albeit a very persistent one-A.Einstein
■ Of ik ben gek of de rest van de wereld.Ik denk zelf de rest van de wereld-Rudeonline
□ The war is not meant to be won.It is meant to be continuous-G.Orwell
  donderdag 27 maart 2008 @ 20:11:04 #106
62215 qu63
..de tijd drinkt..
pi_57655508
quote:
Op donderdag 27 maart 2008 20:07 schreef DionysuZ het volgende:
Natuurlijk krijg je maar 1 rij terug. Om meerdere rijen terug te krijgen moet je, zoals hierboven ergens ook staat, er een while loopje van maken.
ook met
<?php
$q = "SELECT * FROM meldingen";
$res=mysql_query($q);
$i=0;
while($berichten = mysql_fetch_array($res))
{
print $berichten[$i];
$i++;
}
?>

krijg ik maar 1 rij
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
pi_57655745
quote:
Op donderdag 27 maart 2008 20:11 schreef qu63 het volgende:

[..]

ook met
<?php
$q = "SELECT * FROM meldingen";
$res=mysql_query($q);
$i=0;
while($berichten = mysql_fetch_array($res))
{
print $berichten[$i];
$i++;
}
?>

krijg ik maar 1 rij
Nee, je krijgt het nulde element van rij 0, het eerste element van rij 1, het tweede element van rij 2, etc.

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$q 
"SELECT * FROM meldingen";
$res=mysql_query($q);
$berichten = array();
while(
$row mysql_fetch_array($res))
{
  
$berichten[] = $row;
}
echo 
'<pre>';
var_dump($berichten);
echo 
'</pre>';
?>
pi_57657576
Of met PDO :)
1
2
3
4
5
6
7
8
<?php
$q 
"SELECT * FROM meldingen";
$stm $pdo->prepare($q);
$berichten $stm->fetchAll(PDO::FETCH_ASSOC);
echo 
'<pre>';
var_dump($berichten);
echo 
'</pre>';
?>
Wil iedereen die in telekinese gelooft nu mijn hand op steken?
| Foto's van toen en nu | Icons | Whatpulse keyboard | .NET developer? |
  donderdag 27 maart 2008 @ 21:31:20 #109
63192 ursel
"Het Is Hier Fantastisch!
pi_57658115
quote:
Op donderdag 27 maart 2008 21:15 schreef SuperRembo het volgende:
Of met PDO
[ code verwijderd ]
Eindelijk iemand ontopic..
Denk alleen dat qu63 er weinig aan heeft...
  donderdag 27 maart 2008 @ 21:58:03 #110
62215 qu63
..de tijd drinkt..
pi_57659160
quote:
Op donderdag 27 maart 2008 21:31 schreef ursel het volgende:

[..]

Eindelijk iemand ontopic..
Denk alleen dat qu63 er weinig aan heeft...
precies
It's Time To Shine
[i]What would life be like without rhethorical questions?[/i]
pi_57661659
Ik heb een stdClass met een aantal members. Hoe kan ik die omzetten naar een key/value array? Recursief als het kan.

edit:
Ah, gewoon casten naar een array.
1
2
3
<?php
$Array 
= (array) $Object
?>


Is dan wel niet recursief maar hier kom ik wel uit.
pi_57671080
Om maar even ontopic te zijn: PDO is leuk en aardig, maar besef dat je in sommige RDBMS'en die partiele indices ondersteunen geen gebruik kunt maken van die indices zodra je prepared statements gebruikt. Voorbeeldje hiervan is PostgreSQL, die het matchen van de indices al tijdens het preparen van de query doet. Door het ontbreken van je condities (je vult ze namelijk pas later in met Statement->bindValue() of ->bindParam()) is het namelijk onmogelijk om te voorspellen wat je query gaat doen.

Dus mijn idee van good practice in deze situatie: prepared statements gebruiken voor situaties waarbij je eenzelfde soort query heel vaak moet uitvoeren of wanneer je niet geavanceerd gebruik maakt van je database, en anders op de 'oude' manier samenstellen en PDO->quote() gebruiken

Oh en hoi.
  vrijdag 28 maart 2008 @ 14:20:30 #113
63192 ursel
"Het Is Hier Fantastisch!
pi_57672989
Ik zit momenteel eigenlijk met de volgende situatie:

Eens in de 2 weken moet ik een lijst van zo'n 10.000 namen, welke ik via een csv file binnen krijg, vergelijken met alle namen in onze huidige database. Dit zijn er ook zo'n 10.000 stuks.

Uiteindelijk moeten alle namen uit de csv file ook in een tijdelijke db opgeslagen worden.

Nu zit ik een beetje in een dilema wat nu het beste te doen is qua performance. In ons systeem is een generieke functie welke bestanden van een ftp server afhaalt en de gegevens van de file inleest en terug geeft in een array per regel. Pas daarna wordt gekeken welk bestand het is en dus ook wat er moet gebeuren.

Elke keer per regel een query uitvoeren om te kijken of er een match is vergt enorm veel queries achter elkaar. Aan de andere kant ben ik bang dat als ik beide in een array ga plaatsen dat dit ook enorm veel resources van de server gaat vergen.

Iemand enig idee hoe het in performance het beste aan te pakken is om 2 grote arrays met elkaar te vergelijken?
  vrijdag 28 maart 2008 @ 14:58:42 #114
187069 slacker_nl
Sicko pur sang
pi_57673831
Toevallig ben ik met een soort gelijk iets bezig. Onder perl heb je een Array::Compare functie waarbij je 2 arrays met elkaar kan vergelijken.

Echter ben ik het op een andere manier aan het doen.

Ik laad m'n csv file in Oracle (sqlldr is een heel handige tool daarvoor), en vervolgens laat ik een een x-aantal queries los op de DB die de incorrecte entries eruit vist (en ook de correcte entries). De resultaten van elke query worden in cvs format uitgespuugd.

Doordat je alles in de DB gooit kan je over je gehele base checken of alles goed is, ipv per record/naam.

1 tool is verantwoordelijk voor het inladen van de data, een andere tool is verantwoordelijk voor de queries en nog een andere wordt gebruikt om alle mogelijke queries uit te voeren waarna de output naar een file wordt geredirect, en ik een wc -l gebruik om het aantal resultaten weer te geven:

De applicatie die verantwoordelijk is voor de queries heeft een hash waarin alle queries zijn gedefinieerd:

1
2
3
4
5
6
7
8
9
my %queries = ( name_of_query => {
   description => "Description",
   sql => qq{
SELECT * FROM table
WHERE key = value
-- insert more sql code here
}, # end of qq
}, # end of name_of_query
);


Vervolgens is er 1 functie die de queries uitvoert op basis van userinput:

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
sub sql2csv {
    my $sql = shift;
    print STDERR $sql . "\n";
    # Some queries return undef
    # warnings are noise in that case
    no warnings;
    foreach ($oracle->do_query($sql)) {
        print join (",", @$_) . "\n";
    }
    use warnings;
}

sub do_query {
    my $query_id = shift;
    if (exists $queries{$query_id}) {
        printf STDERR "/* %s */\n", $queries{$query_id}->{description} 
          if defined $queries{$query_id}->{description};

        my $sql = $queries{$query_id}->{sql};

        if ($opt{limit}) {
            $sql = join("\n", $sql, sprintf($limit_query, $opt{limit}));
        }

        if ($opt{order}) {
            $sql = join("\n", $sql, $order_query);
        }
        sql2csv($sql);
    } else {
        printf STDERR "Query for %s does not exists!\n", $query_id;
    }
}


Vervolgens kan ik alle checks uitvoeren door hetvolgende:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

exe=./datacheck
total="^total_"

do_query() {
        local i
        for i in $* ; do
                file=../out/RESULTS.$i
                $exe --query $i > $file 2>../out/QUERY.$i ; wc -l $file
        done
}

do_query $($exe --list | grep $total) $($exe --list | grep -v $total)


Voordeel is dat ik het grootste gedeelte in de DB zelf afhandel, en ik zelf niet moeilijk hoef te gaan doen om arrays met elkaar te vergelijken. Ander pluspunt, maar die had ik al aangegeven, ik hoef niet per record een aparte query uit te voeren.
In theory there is no difference between theory and practice. In practice there is.
  vrijdag 28 maart 2008 @ 15:11:03 #115
63192 ursel
"Het Is Hier Fantastisch!
pi_57674039
We werken hier in ieder geval met MySQL.
Weet niet of dat verder consequenties heeft.

Daarnaast, die Perl functie, dat zou betekenen dat ik beide al in een array zal moeten hebben. Weet niet of dat zo tactisch is..
  vrijdag 28 maart 2008 @ 16:09:21 #116
187069 slacker_nl
Sicko pur sang
pi_57675300
quote:
Op vrijdag 28 maart 2008 15:11 schreef ursel het volgende:
We werken hier in ieder geval met MySQL.
Weet niet of dat verder consequenties heeft.

Daarnaast, die Perl functie, dat zou betekenen dat ik beide al in een array zal moeten hebben. Weet niet of dat zo tactisch is.. :{
Maakt verder niet uit of je MySQL of Oracle gebruikt. Mijn queries zijn ook onder MySQL te gebruiken. Ik gebruik de PDO variant van Perl, dussuh.. :)

In beide gevallen een array? ow, voor array::compare, maar als je alles door de DB laat checken heb je dat helemaal niet nodig, en als je het wel nodig hebt, kan je 2 arrays aanmaken, je csv file line by line inlezen, query bakken aan de hand van je csv file, en die loslaten, vervolgens de arrays gaan vergelijken, dan krijg je zoiets:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
my (@array_db, @array_csv);
my $comp= Array::Compare->new();

open(FH, $csvfile);
while(<FH>) {
    chomp(); # Remove the new line
    @array_csv = split(/,/, $_);

    # Do stuff met array_csv to create the SQL code
    $sql = sprintf "SELECT * FROM example WHERE example_name = '%s'", $array_csv[1];

    # ervanuitgaand dat do_query een array returned
    @array_db = do_query($sql); 

    # Compare werkt met een reference naar een array.
    if ($comp->compare(\@array_csv, \@array_db)) {
        # compare is OK
    } else {
        # Compare failed
    }
}


Enige lelijke is wat je al aangaf, de hoeveelheid nagenoeg identieke queries. Maar daarom zou ik je csv file in je DB laden zodat je alles met SQL kan checken.

Waarom moet jij moeilijk gaan proggen als je de DB al het moeilijke werk kan laten doen door een paar goed gekozen queries.
In theory there is no difference between theory and practice. In practice there is.
  vrijdag 28 maart 2008 @ 16:26:58 #117
63192 ursel
"Het Is Hier Fantastisch!
pi_57675708
Tja, dat is idd een oplossing, alleen misschien nog een belangrijk detail dat ik eigenlijk nog vergeten was, de opzet was ook om de namen in de similar_text te zetten en te kijken of de naam er voor meer dan 90% op lijkt.

Ergens anders kreeg ik eigenlijk ook het advies om de vergelijking door de database te laten uitvoeren middels een FULL outer join. Alleen is eigenlijk dan dus mijn probleem hoe kan ik 2 tabellen met elkaar goed vergelijken welke een match hebben van meer dan 90%.
pi_57703567
quote:
Op vrijdag 28 maart 2008 12:50 schreef JeRa het volgende:
Om maar even ontopic te zijn: PDO is leuk en aardig, maar besef dat je in sommige RDBMS'en die partiele indices ondersteunen geen gebruik kunt maken van die indices zodra je prepared statements gebruikt. Voorbeeldje hiervan is PostgreSQL, die het matchen van de indices al tijdens het preparen van de query doet. Door het ontbreken van je condities (je vult ze namelijk pas later in met Statement->bindValue() of ->bindParam()) is het namelijk onmogelijk om te voorspellen wat je query gaat doen.

Dus mijn idee van good practice in deze situatie: prepared statements gebruiken voor situaties waarbij je eenzelfde soort query heel vaak moet uitvoeren of wanneer je niet geavanceerd gebruik maakt van je database, en anders op de 'oude' manier samenstellen en PDO->quote() gebruiken

Oh en hoi.
Je kunt met PostgreSQL toch zeker wel geparameteriseerde query's uitvoeren zonder de hele performance om zeep te helpen?
Wil iedereen die in telekinese gelooft nu mijn hand op steken?
| Foto's van toen en nu | Icons | Whatpulse keyboard | .NET developer? |
pi_57703891
quote:
Op zaterdag 29 maart 2008 20:57 schreef SuperRembo het volgende:

[..]

Je kunt met PostgreSQL toch zeker wel geparameteriseerde query's uitvoeren zonder de hele performance om zeep te helpen?
Dat kan ook wel ja, maar dus niet met partiële indices vanwege de reden die ik noemde. Het is een leuke pitfall in ieder geval met MySQL kan ik geen vergelijking geven aangezien die geen partiële indices ként.
pi_57705701
quote:
Op zaterdag 29 maart 2008 21:10 schreef JeRa het volgende:

[..]

Dat kan ook wel ja, maar dus niet met partiële indices vanwege de reden die ik noemde. Het is een leuke pitfall in ieder geval met MySQL kan ik geen vergelijking geven aangezien die geen partiële indices ként.
In dat geval lijkt het me good practice om altijd geparameteriseerde query's te gebruiken, tenzij performance een een speciale aanpak vereist.
Wil iedereen die in telekinese gelooft nu mijn hand op steken?
| Foto's van toen en nu | Icons | Whatpulse keyboard | .NET developer? |
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')