/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Hjælp til "Dummi's"
Fra : saluki-dk


Dato : 12-10-06 10:03

Hej

Jeg er ved at lægge min dBaseIV database med ~19.000 hunde på
www.saluki.dk, og er startet med nogle små rutiner - men jeg syntes at
det ind imellem IKKE er nemt.

Jeg har to små problemer - som nok vil et par stykker til at skrige af
grin.
Al begyndelse er svær

Problem #1:
Jeg skal finde nogle filnavne der begynder med "nr" og slutter med
"htm" (... og hvor svært kan det lige være !!!!)
if (ereg("nr*htm",$file)) { giver ingen svar
Men
if (ereg("^(nr*)",$file)) {
if (ereg("htm",$file)) { virker

Hvorfor f... skal jeg bruge 2 IF for at få det til at virke ??


Problem #2.
jeg har min liste over aktuelle hunde ($tlist) og hvem der er logget
ind ($user)- nu skal jeg finde de hunde som brugeren har adgang til at
rette.
Den her virker....

$query = "SELECT CONCAT(Tenbase.kennel,' ',Tenbase.navn) AS hundnavn
   FROM Tenbase
   WHERE Tenbase.inr IN (" . $tlist . ")
      and (Tenbase.ejer_nr=$user
         or Tenbase.coejer_nr=$user)
      ORDER BY hundnavn";

Men da jeg øgede retighederne til informationer der ligger
undertabellen "mklitter" - så går det helt galt:

$query = "SELECT CONCAT(Tenbase.kennel,' ',Tenbase.navn) AS hundnavn
   FROM Tenbase
   LEFT OUTER JOIN mklitter ON Tenbase.lnr = mklitter.lnr
   WHERE Tenbase.inr IN (" . $tlist . ")
      and (Tenbase.ejer_nr=$user
         or Tenbase.coejer_nr=$user
         or mklitter.bnr=$user
         or mklitter.cbnr=$user)
      ORDER BY hundnavn";

.....giver følgende fejl:

The SELECT would examine more rows than MAX_JOIN_SIZE. Check your WHERE
and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT
is ok

Det er garanteret min JOIN der ikke virker - men jeg har "lånt" den
fra en anden funktion hvor den virker.

AHrraa...... - pls. hjælp mig

Venlig hilsen
Henrik Stampe - www.saluki.dk


 
 
Bertel Lund Hansen (12-10-2006)
Kommentar
Fra : Bertel Lund Hansen


Dato : 12-10-06 10:43

saluki-dk skrev:

> Jeg har to små problemer - som nok vil et par stykker til at skrige af
> grin.

Der er ingen der griner hvis de husker hvordan de selv begyndte.

> Al begyndelse er svær

Nemlig.

> Problem #1:
> Jeg skal finde nogle filnavne der begynder med "nr" og slutter med
> "htm" (... og hvor svært kan det lige være !!!!)
> if (ereg("nr*htm",$file)) { giver ingen svar
> Men
> if (ereg("^(nr*)",$file)) {
> if (ereg("htm",$file)) { virker

> Hvorfor f... skal jeg bruge 2 IF for at få det til at virke ?

Fordi du sætter to betingelser. Rent teknisk kan man godt komme
af med det ene IF, men det er ikke bedre på nogen måde. Nogle vil
mene at det er lidt mindre læsevenligt:

   if (ereg("^(nr*)",$file) and ereg("htm",$file)) ...

Det er jo bare en anden måde at gøre det samme på [1].

> Problem #2.

> Men da jeg øgede retighederne til informationer der ligger
> undertabellen "mklitter" - så går det helt galt:

> $query = "SELECT CONCAT(Tenbase.kennel,' ',Tenbase.navn) AS hundnavn
>    FROM Tenbase
>    LEFT OUTER JOIN mklitter ON Tenbase.lnr = mklitter.lnr
>    WHERE Tenbase.inr IN (" . $tlist . ")
>       and (Tenbase.ejer_nr=$user
>          or Tenbase.coejer_nr=$user
>          or mklitter.bnr=$user
>          or mklitter.cbnr=$user)
>       ORDER BY hundnavn";

> ....giver følgende fejl:

> The SELECT would examine more rows than MAX_JOIN_SIZE.

En JOIN producere N*M resultater hvis den ene tabel har N
elementer og den anden M - også selv om nogle betingelser
bagefter reducerer slutantallet til ganske få. Hvis N*M er mindre
end det tilladte maks, går det fint, men ellers går det galt.

Jeg snakkede engang med en fyr der var i gang med noget
databasesøgning. Det kørte *ekstremt* langsomt, og så sagde han
med et skævt grin: "Tja, måske skulle jeg ikke have lavet det med
syvogtyve JOIN's oven i hinanden".


[1] Det er egentlig sprogafhængigt. Nogle sprog undersøger begge
betingelser ved en AND. Andre bruger kortsluttet boolesk algebra
hvor undersøgelsen stopper så snart man kan forudsige resultatet.
Eksempler:

   if (0 and 5/0) echo "Hvad? Det er jo ulovligt!";
   else echo "Vi springer over hvor gærdet er lavest";

PHP giver ikke fejl for det kommer slet ikke til den ulovlige
division. Allerede ved 0 er det klart at det samlede udtryk
bliver falsk, og så afsluttes den linje.

I [har glemt hvilket sprog] vil begge betingelser blive
undersøgt, og så stopper programmet med en fejl.

Hvis man skriver koden med to if'er, virker det ens i begge slags
systemer.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Martin (12-10-2006)
Kommentar
Fra : Martin


Dato : 12-10-06 12:45

saluki-dk wrote:
> Problem #1:
> Jeg skal finde nogle filnavne der begynder med "nr" og slutter med
> "htm" (... og hvor svært kan det lige være !!!!)
> if (ereg("nr*htm",$file)) { giver ingen svar
> Men
> if (ereg("^(nr*)",$file)) {
> if (ereg("htm",$file)) { virker
>
> Hvorfor f... skal jeg bruge 2 IF for at få det til at virke ??

Hvordan har du de filnavne?
Har du dem i et array, fra en database, eller skal der laves en liste ud
fra et bibliotek på serveren?

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste