[mysql] [php]Een update query herhalen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 20-09 08:23
Het volgende heb ik aan de hand.

Ik heb een aantal toestellen die voor de website zichtbaar en onzichtbaar gemaakt kunnen worden. Dit kan ik doen door in de mysql database de mobile_state op 0 of op 1 te zetten.

Dit systeem werkt naar behoren.

Nu heb ik de pagina iets aangepast waarbij ik met behulp van een checkboxen in een keer meerdere toestellen op zichtbaar of onzichtbaar kan zetten.

Nu kan ik nog een rangorde geven aan toestellen. Dit gebeurt met behulp van de mobile_order. Als een toestel op zichtbaar gezet wordt, dan wordt de hoogste mobile_order uit de database gehaald. Deze wordt dan verhoogd met 10.

Het volgende script had ik daarvoor. (Hierin zit het systeem van de checkboxen al in gebouwd)

PHP:
1
2
3
4
5
6
7
8
9
10
11
if($_POST['actie'] =="show") {
if(empty($_POST['checkbox'])){$message = ("Er zijn geen toestellen geselecteerd");
}else{
$a = implode(",", $_POST['checkbox']);
    $result=mysql_query("SELECT MAX(mobile_order) AS max_order FROM mobile_phones WHERE mobile_brand = '$brand' AND mobile_state = 0")or die (mysql_error());
    $row=mysql_fetch_object($result); 
    $max_ord = intval($row->max_order);
    $next_order = $max_ord + 10;
    $result=mysql_query("UPDATE mobile_phones SET mobile_state = 0, mobile_order = '$next_order' WHERE mobile_id = '$a'") or die (mysql_error());
    echo("De $brand $type is zichtbaar op de website");
}}


Nu werkt het bovengenoemde al. Alleen als je vijf toestellen op zichtbaar zet dan krijgen ze allemaal dezelfde mobile_order

Om er voor te zorgen dat dit niet zo werkt had ik het al geprobeerd met een foreach lus.
Maar dan geeft hij aan dat het een invalid argument is.

Als ik een hint krijg ga ik zelf wel weer even door met uitzoeken.

[ Voor 7% gewijzigd door josvane op 28-02-2005 21:28 ]


Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 17-09 20:52

ripexx

bibs

De hint is gebruik maken van array's

Als je het webform zo opbouwd dat deze een stel array's terug geeeft kan je hier eenvoudig met een foreach door heen lopen. En dan dynamisch de query aanpassen. Om van een input veld in html een php array te maken doe zoiets:
HTML:
1
<input type="checkbox" name="arraynaam[]" value="1">


Dus door er [] om heen te zetten wordt de variabele van $_POST["arraynaam"] van het type array ;)

De rest is wel te vindne op het net, en anders post je je vragen :)

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 00:18
Dit is toch gewoon een kwestie van creatief programmeren, en met een foreach door een array heen lopen. De html kun je doen zoals ripexx al zegt..

|>


Acties:
  • 0 Henk 'm!

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08 14:36
Ik snap eigenlijk niet zo goed waarom de volgorde veranderd zou moeten worden als je iets zichtbaar of onzichtbaar maakt.

| Toen / Nu


Acties:
  • 0 Henk 'm!

  • R4NCOR
  • Registratie: December 2000
  • Laatst online: 16-09 12:26

R4NCOR

eigenlijk gewoon Niels

SuperRembo schreef op maandag 28 februari 2005 @ 22:46:
Ik snap eigenlijk niet zo goed waarom de volgorde veranderd zou moeten worden als je iets zichtbaar of onzichtbaar maakt.
Dat volg ik ook niet helemaal :? Als je iets op onzichtbaar hebt staan dan doet de rangorde er toch ook helemaal niet toe?

Acties:
  • 0 Henk 'm!

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 20-09 08:23
De foreach functie heb ik op de volgende manier toegepast.

PHP:
1
2
3
4
5
6
7
8
9
10
11
if($_POST['actie'] =="show") {
if(empty($_POST['checkbox'])){$message = ("Er zijn geen toestellen geselecteerd");
}else{
foreach($_POST['checkbox'] as $b);{
    $result=mysql_query("SELECT MAX(mobile_order) AS max_order FROM mobile_phones WHERE mobile_brand = '$brand' AND mobile_state = 0")or die (mysql_error());
    $row=mysql_fetch_object($result); 
    $max_ord = intval($row->max_order);
    $next_order = $max_ord + 10;
    $result=mysql_query("UPDATE mobile_phones SET mobile_state = 0, mobile_order = '$next_order' WHERE mobile_id = '$b'") or die (mysql_error());
    echo("De $brand $type is zichtbaar op de website");
}}}


Als ik dit aanroep dan gaat het goed, maar hij maakt maar 1 toestel zichtbaar. Het lijkt er dus op dat de loop niet goed werkt.

Mijn checkboxen heb ik als volgt.

PHP:
1
<input type=\"checkbox\" value=\"$row->mobile_id\" name=\"checkbox[$row->mobile_id]\">


Als ik dit script uitvoer dan maakt hij van de $row->mobile_id gewoon een getal

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Er staat een ; achter je foreach, dat gaat niet lukken....

Je kan trouwens ook maar beter even leren uitlijnen, dit is gewoon niet fatsoenlijk leesbaar.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if ($_POST['actie'] == 'show') {
   if (empty($_POST['checkbox'])) {
      $message = 'Er zijn geen toestellen geselecteerd';
   } else {
      foreach($_POST['checkbox'] as $b) {
          $result = mysql_query("
                             SELECT MAX(mobile_order) AS max_order
                             FROM mobile_phones
                             WHERE mobile_brand = '$brand' AND mobile_state = 0
                          ") or die (mysql_error());
          $row = mysql_fetch_object($result); 
          $max_ord = intval($row->max_order);
          $next_order = $max_ord + 10;
          $result = mysql_query("
                             UPDATE mobile_phones
                             SET mobile_state = 0,
                                 mobile_order = '$next_order'
                             WHERE mobile_id = '$b'
                          ") or die (mysql_error());
          echo "De $brand $type is zichtbaar op de website";
      }
   }
}

Das toch veel beter te lezen?

[ Voor 127% gewijzigd door NMe op 01-03-2005 16:08 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 20-09 08:23
Het is inderdaad beter te lezen zo. Maar het werkt nog niet. Ik heb gelijk als eerste in de foreach loop. $b laten echooen. Dan geeft hij netjes de geseleteerde waardes aan.

Maar als ik ga kijken maakt hij van de mobile_order nog steeds drie gelijke waardes.

wat bij foreach tussen de {} staat herhaalt hij toch iedere keer?

Acties:
  • 0 Henk 'm!

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 20-09 08:23
Ik ben erachter waarom het niet werkt. Maar tevens zie ik de fout ook niet.

PHP:
1
2
3
    $result=mysql_query("SELECT MAX(mobile_order) AS max_order FROM mobile_phones WHERE mobile_brand = '$brand' AND mobile_state = 0")or die (mysql_error());
    $row=mysql_fetch_object($result); 
    $max_ord = intval($row->max_order);


Als ik het een en ander echo blijft $row->max_order leeg. Hierdoor verhoogt hij niks met 10. Waardoor ik iedere keer als hij dit herhaalt 10 krijg.

Ik denk dat ik de mysql_query anders moet defineeren omdat ik nu gebruik moet maken van super globals

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

De fout zit in je query. Je selecteert eerst een max, en vervolgens gooi je daar een where-clausule overheen. Je zou kunnen proberen of het werkt als je WHERE door HAVING vervangt, maar ik geef je weinig kans. Misschien als je groepeert op mobile_brand en daarna alleen die dat ene record teruggeeft dat overeen komt met je huidige WHERE?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08 14:36
Josvane, waarom verander je de volgorde van dingen die je toch niet ziet? De onzichtbare rows hebben toch geen invloed op de volgorde van de zichtbare rows.

| Toen / Nu


Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
josvane schreef op dinsdag 01 maart 2005 @ 21:44:
Ik ben erachter waarom het niet werkt. Maar tevens zie ik de fout ook niet.

PHP:
1
2
3
    $result=mysql_query("SELECT MAX(mobile_order) AS max_order FROM mobile_phones WHERE mobile_brand = '$brand' AND mobile_state = 0")or die (mysql_error());
    $row=mysql_fetch_object($result); 
    $max_ord = intval($row->max_order);


Als ik het een en ander echo blijft $row->max_order leeg. Hierdoor verhoogt hij niks met 10. Waardoor ik iedere keer als hij dit herhaalt 10 krijg.

Ik denk dat ik de mysql_query anders moet defineeren omdat ik nu gebruik moet maken van super globals
Het probleem zit hem inderdaad in je query je krijgt geen resultaat terug, $result krijgt hierdoor de waarde false of wanneer de query geldig is een resource identifier die geen data bevat. $row wordt hierdoor ook null, zodat $max_ord altijd de waarde 0 opleverd.

Dit heeft echter niets te maken met het gebruik van superglobals!

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Borizz schreef op dinsdag 01 maart 2005 @ 22:46:
Dit heeft echter niets te maken met het gebruik van superglobals!
Niet alleen met superglobals, maar het kan er wel degelijk iets mee van doen hebben. Ik weet bijvoorbeeld niet waar $brand en $type vandaan komen. Als deze niet van tevoren geïnitialiseerd zijn op de een of andere manier, dan zijn superglobals een mooie tweede verdachte. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1