Avatar billede kgp43 Nybegynder
08. juli 2004 - 11:53 Der er 27 kommentarer og
1 løsning

Problemer med løkker

Okay, here we go.

Jeg har to løkker, den første skal kun bruges til at finde id'er på mine produkter, den anden checker om der er listet priser til de enkelte produkter. Den kommer ikke med noget output, har checket og kan se den går i stå efter den første løkke. Hvis jeg ændre den sidste løkke, så den kun checker om $no er sat, så "virker" det. Problemet er at der kun skal komme ét output for hvert produkt, ellers bliver min tabel opretter for hvert produkt (hvilken ikke er meningen).

$query3 = mysql_query("SELECT * FROM products WHERE series_id='$row2[id]' AND type='Reels' AND validation_status='1' ") or die (mysql_error());
while($row3 = mysql_fetch_array($query3)) {
$no++;
           
$sql_doublecheck3 = mysql_query("SELECT * FROM prices WHERE product_id='$row3[id]' ") or die (mysql_error());
$doublecheck3 = mysql_num_rows($sql_doublecheck3);
if(($doublecheck3 != 0) && ($no)) {


- er der nogen der kan se problemet?
Avatar billede kgp43 Nybegynder
08. juli 2004 - 11:56 #1
Woops, den sidste linie i den sidste løkke skal se sådan ud:
if(($doublecheck3 != 0) && ($no == 1)) {

(stadig samme problem, kom bare til at poste mens jeg testede)

rettet:
--------------
$query3 = mysql_query("SELECT * FROM products WHERE series_id='$row2[id]' AND type='Reels' AND validation_status='1' ") or die (mysql_error());
while($row3 = mysql_fetch_array($query3)) {
$no++;
           
$sql_doublecheck3 = mysql_query("SELECT * FROM prices WHERE product_id='$row3[id]' ") or die (mysql_error());
$doublecheck3 = mysql_num_rows($sql_doublecheck3);
if(($doublecheck3 != 0) && ($no == 1)) {
Avatar billede jaw Nybegynder
08. juli 2004 - 12:13 #2
Altså, du vil have et output på 1 af hvert produkt ikke? Så kan du bruge GROUP BY produkt hvis det er produkt der er feltet der ikke må dupliceres...
Avatar billede kgp43 Nybegynder
08. juli 2004 - 12:48 #3
åhhh, jeg viste dette her ville blive inviklet :P

Jeg kan ikke anvende GROUP BY, da jeg skal sortere efter series-navne, disse felter består af tal/id'er (serierne er i en anden tabel). Jeg har en query før de to jeg har postet (samt en masse andre), der checker alle series (row2[id]) og sortere efter navn. Tror ikke det kan laves meget anderledes end ovenfor, men du er da velkommen til at tage et kig (se kilden): http://www.tackleprices.com/tackleprices.txt
Avatar billede jaw Nybegynder
08. juli 2004 - 12:52 #4
Hvad er det for et felt, fra hvilken database du vil have output fra? For når du søger efter om $no == 1 - ja, det vil den jo kun være 1 gang og derfor kun 1 output... Næste gang løkken kører, vil $no være 2. Evt. paste et par linier endnu.
Avatar billede kgp43 Nybegynder
08. juli 2004 - 12:54 #5
alle linierne er i overstående link.
Avatar billede kgp43 Nybegynder
08. juli 2004 - 12:55 #6
$no bliver unset for hver gang brand-qeury kører.. jeg prøver lige at add nogle flere forklaringer til min kode... 2 sec
Avatar billede jaw Nybegynder
08. juli 2004 - 12:58 #7
Jeg ville faktisk også gerne have et link til hvor koden er i action, hvis jeg må det? For lige at forstå hvad det er den tager flere gange og sådan...
Avatar billede kgp43 Nybegynder
08. juli 2004 - 13:17 #8
vedr $no;

Jeg vil kun have 1 tabel for hvert produkt, men tabellen skal kun laves hvis der er tilføjet series, produkter og priser - selve rækkerne med serierne bliver postet længere nede (I selve tabellen). Det virkede i går, men jeg har lavet et eller andet, så det ikke virker mere.
           
$query3 = mysql_query("SELECT * FROM products WHERE series_id='$row2[id]' AND type='Reels' AND validation_status='1' ") or die (mysql_error());
while($row3 = mysql_fetch_array($query3)) {
$no++;

Overstående løkke: Her finder vi ALLE produkter, der er knyttet til den forrige løkke (serie løkken).

Understående løkke: Her checker vi kun om der er en pris knyttet til produktet, hvis ja så laver vi tabellen. Vi er ligeglade med produkterne, da det er serierne vi skal have listet (men kun hvis der er knyttet produkter (og igen priser til produkterne) til serierne).
           
$sql_doublecheck3 = mysql_query("SELECT * FROM prices WHERE product_id='$row3[id]' ") or die (mysql_error());
$doublecheck3 = mysql_num_rows($sql_doublecheck3);
if(($doublecheck3 != 0) && ($no == 1)) {
Avatar billede kgp43 Nybegynder
08. juli 2004 - 13:23 #9
Jeg vender lige tilbage om et par timer, det ser ud til at jeg (med et uheld) har kommet til at overskrive filen med en gammel backup.. damn
Avatar billede jaw Nybegynder
08. juli 2004 - 13:25 #10
Det var jo ærgerligt... :/ Hvis det kan hjælpe dig, har jeg kildekoden fra den fil du pastede et par kommentarer oppe åbne, hvis det svarer til det du har overskrevet?
Avatar billede kgp43 Nybegynder
08. juli 2004 - 13:32 #11
Jeg lavede fejlen i nat, roede lidt for meget rundt i det - sådan går det når man er lidt søvnig :/

Ser dog ikke ud til der er sket den store skade.
Hvis jeg fjerne $no, så laver den en ny tabel for hvert produkt, i stedet for brand - det burde være mere "simplet" at løse. Linket er opdateret: http://www.tackleprices.com/tackleprices.txt
Avatar billede kgp43 Nybegynder
08. juli 2004 - 13:32 #12
Jeg brugte $no til at forhindre dette
Avatar billede kgp43 Nybegynder
08. juli 2004 - 13:37 #13
Grunden til at den laver en tabel for hvert produkt er den første løkke (af de to postet nedenunder). Den første checker alle produkter, herefter checker den om der er tilføjet en pris til produktet, hvis ja så oprettes en tabel. Dette er forkert, da der kun skal oprettes én tabel for hvert brand - kan ikke se nogen fejl, sammenligned med den tidligere kode. Dengang løste jeg problemet med $no

$query3 = mysql_query("SELECT * FROM products WHERE series_id='$row2[id]' AND type='Reels' AND validation_status='1' ") or die (mysql_error());
while($row3 = mysql_fetch_array($query3)) {
           
$sql_doublecheck3 = mysql_query("SELECT * FROM prices WHERE product_id='$row3[id]' ") or die (mysql_error());
$doublecheck3 = mysql_num_rows($sql_doublecheck3);
if($doublecheck3 != 0) {
Avatar billede jaw Nybegynder
08. juli 2004 - 13:59 #14
Jeg har lidt svært ved at overskue det, men har da et par foreslag.

1.
Kan ikke se, at dit $no ikke skulle virke

2.
$query = mysql_query("SELECT * FROM brand WHERE status='1' AND validation_status='1' GROUP BY brand") or die (mysql_error());

3.
$q = mysql_query("SELECT brand.*, series.*, products.*, prices.* FROM brand, series, products, prices WHERE brand.status = '1' AND series.brand_id = brand.id AND series.type = 'Reels' AND series.validation_status = '1' AND products.series_id = series.id AND products.series_type = 'Reels' AND products.validation_status = '1' AND prices.product_id = products.id");

while($row = mysql_fetch_array($q)) {
  //table
}

Den sidste ved jeg ikke, for jeg ved ikke om man kan tage så meget på een gang :)

Men du har det ikke oploadet? Så man kan se det i action ved siden af kun at have kildekoden?
Avatar billede kgp43 Nybegynder
08. juli 2004 - 14:25 #15
Du kan se det i action her (troede jeg allerede havde postet linket):
http://www.tackleprices.com/products/reels/fishing-reel-series.php
Avatar billede kgp43 Nybegynder
08. juli 2004 - 14:28 #16
1. Lige mine ord, burde det ikke virke?

2. Jeg har kun unikke brands i min brand tabel (der er ikke to ens), så der skal ikke anvendes GROUP BY (så vidt jeg forstår)

3. Puhaaa, forstår intet af den query, det er for advanceret for mig :(
Avatar billede jaw Nybegynder
08. juli 2004 - 14:28 #17
Hvad sker der hvis du bruger:

$query = mysql_query("SELECT * FROM brand WHERE status='1' AND validation_status='1' GROUP BY brand") or die (mysql_error());

?
Avatar billede jaw Nybegynder
08. juli 2004 - 14:30 #18
Nej ok, hvis du er unikke skal du selvf. ikke bruge GROUP BY
Avatar billede kgp43 Nybegynder
08. juli 2004 - 14:32 #19
ingen forandring.

problemet ligger her, uden $no kører den løkken igennem for hvert produkt, hvilket resulterer i en tabel for hvert produkt (i stedet for brand):

$query3 = mysql_query("SELECT * FROM products WHERE series_id='$row2[id]' AND type='Reels' AND validation_status='1' ") or die (mysql_error());
while($row3 = mysql_fetch_array($query3)) {
           
$sql_doublecheck3 = mysql_query("SELECT * FROM prices WHERE product_id='$row3[id]' ") or die (mysql_error());
$doublecheck3 = mysql_num_rows($sql_doublecheck3);
if($doublecheck3 != 0) {
Avatar billede jaw Nybegynder
08. juli 2004 - 14:35 #20
ja, tror jeg ville ud i noget i stil med:

$sidste_brand = "";

inde i løkken, ville jeg så sætte $sidste_brand = $row[brand] (den der indeholder Abu Garcia)

og så få flettet en if ind:
if($sidste_brand != $row[brand])
  //udskriv tabellen
}

Er det den mindste smule forståeligt? Jeg skal lige se om jeg også kan overskue at indsætte det et logisk sted i din kilde...
Avatar billede kgp43 Nybegynder
08. juli 2004 - 14:40 #21
Tror ikke det virker, da fejlen opstår efter brand løkken (omkring product/price løkken)
Avatar billede kgp43 Nybegynder
08. juli 2004 - 14:41 #22
men er det ikke allerede den metode jeg har anvendt? bare med $no i stedet for... hmmm, det bliver vist lidt forvirrende nu.
Avatar billede kgp43 Nybegynder
08. juli 2004 - 14:51 #23
Har prøvet at anvende last_product, men det virker heller ikke. Den kommer ikke med en fejl, men den opretter stadig en ny tabel for hvergang der er et produkt i db'en.

$last_product = "";
$query3 = mysql_query("SELECT * FROM products WHERE series_id='$row2[id]' AND type='Reels' AND validation_status='1' ") or die (mysql_error());
while($row3 = mysql_fetch_array($query3)) {
           
$sql_doublecheck3 = mysql_query("SELECT * FROM prices WHERE product_id='$row3[id]' ") or die (mysql_error());
$doublecheck3 = mysql_num_rows($sql_doublecheck3);
if(($doublecheck3 != 0) && ($last_product != $row2[id])) {
               
$last_product = $row2[id];

...create table....
Avatar billede jaw Nybegynder
08. juli 2004 - 15:11 #24
Jeg kan ikke overskue alle dine query's. Det bliver jeg nødt til at indrømme :/ Medmindre jeg får et dump eller noget af databasen så jeg kan sætte det op og teste selv her, så kan jeg nok ikke gøre meget mere end bare at fortsætte forvirringen... Kan ikke lige se om det er den ene eller anden løkke der gør at den kører videre...
Avatar billede kgp43 Nybegynder
08. juli 2004 - 15:17 #25
Jeg prøver mig lige frem i aften, vender tilbage imorgen hvis jeg ikke kan få det til at virke.
Avatar billede kgp43 Nybegynder
09. juli 2004 - 02:13 #26
hehe, godt jeg ikke gik i seng. Har lige fixet det (har ikke set nogle fejl endnu). Puhaaa, tror jeg smutter i seng - har snart brugt et døgn på den side :P

Ligger du et svar, så får du point :)
Avatar billede jaw Nybegynder
09. juli 2004 - 02:35 #27
Jeg lægger gerne et svar, men forventer nu ikke point - løste jo ikke dit problem :)

Men glad for at du fik det til at virke :)

Også godnat herfra...
Avatar billede kgp43 Nybegynder
09. juli 2004 - 02:55 #28
Godnat.
Du får point for den tid du har brugt på mig :)

Takker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester