[php] if-else probleempje

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • marcovtwout
  • Registratie: Juli 2004
  • Laatst online: 05-08 08:55
Ik zit hier al een paar uur aan te werken maar ik zie de fout maar niet.
Dit is onderdeel van een nieuwsbriefsysteem.
Dit scriptje is voor het activeren van een adres.

Het vreemde is, de UPDATE query wordt uitgevoerd, maar "Onjuiste activatiecode" komt eruit.
Kijk ik ergens overheen of zit de fout dieper?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$emailadres = htmlspecialchars(strip_tags($_GET['emailadres']), ENT_QUOTES);
$activatiecode = htmlspecialchars(strip_tags($_GET['activatiecode']), ENT_QUOTES);

$result = mysql_query("SELECT COUNT(*) FROM nieuwsbrief WHERE emailadres='" . $emailadres . "' AND activatiecode='" . $activatiecode . "'", $db);
if(mysql_result($result,0) > 0)
{
    mysql_query("UPDATE nieuwsbrief SET activatiecode=NULL,datum_geactiveerd=NOW(),IP_geactiveerd='" . $_SERVER['REMOTE_ADDR'] . "' WHERE emailadres='" . $emailadres . "' AND activatiecode='" . $activatiecode . "'", $db);
    $report = "Goed";
}
else
{
    $report = "Onjuiste activatiecode";
}


---
Sorry gepost in verkeerde forum, kan iemand em verplaatsen?

---
Nieuw probleem onderaan ;)

[ Voor 91% gewijzigd door marcovtwout op 31-12-2004 11:06 ]


Acties:
  • 0 Henk 'm!

  • RAJH
  • Registratie: Augustus 2001
  • Niet online
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$emailadres = htmlspecialchars(strip_tags($_GET['emailadres']), ENT_QUOTES);
$activatiecode = htmlspecialchars(strip_tags($_GET['activatiecode']), ENT_QUOTES);

$result = mysql_query("SELECT COUNT(*) FROM nieuwsbrief WHERE emailadres='" . $emailadres . "' AND activatiecode='" . $activatiecode . "'", $db);
if(mysql_num_rows($result) > 0)
{
    mysql_query("UPDATE nieuwsbrief SET activatiecode=NULL,datum_geactiveerd=NOW(),IP_geactiveerd='" . $_SERVER['REMOTE_ADDR'] . "' WHERE emailadres='" . $emailadres . "' AND activatiecode='" . $activatiecode . "'", $db);
    $report = "Goed";
return;
}
else
{
    $report = "Onjuiste activatiecode";
}


Zo dan?

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

PHP hoort in Programming & Webscripting :)
WG -> PW

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • marcovtwout
  • Registratie: Juli 2004
  • Laatst online: 05-08 08:55
Bedankt Ro, ik weet niet waarom maar mysql_num_rows heeft het gefixt :)
Waarom zou ie eerst beide structuren uitvoeren?
Zou het een php-bug zijn?

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Dat is geen fix... Uit een count(*) komt altijd meer dan 0 records :X

Overigens komt er uit mysql_result($result, 0) een array, geen getal. Owja en wellicht zou je kunnen overwegen om niet html-encoding over je invoer te gooien als je het de database in doet, maar er met mysql_escape_string voor te zorgen dat je de goede escaping krijgt.

[ Voor 71% gewijzigd door ACM op 29-12-2004 19:54 ]


  • marcovtwout
  • Registratie: Juli 2004
  • Laatst online: 05-08 08:55
Er komt in dit geval natuurlijk 1 record uit, maar volgens mij kijkt ie niet of het aantal records groter is dan nul, maar naar het getal wat eruit komt. Tenminste, dat probeerde ik met het eerste. En het werkt nu wel :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee, jij keek of de gereturnde array > 0 (altijd false), terwijl Ro keek of het aantal gereturnde records > 0 (altijd true)

Beide oplossingen zijn dus fout. mysql_result ($result, 0, 0) zal wel werken, volgens de documentatie

[ Voor 11% gewijzigd door .oisyn op 30-12-2004 10:32 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
marcovtwout schreef op donderdag 30 december 2004 @ 10:02:
Er komt in dit geval natuurlijk 1 record uit,
Uit een "select count(*) from ..." komt altijd 1 record. En in dat record zit 1 getal met de waarde 0 of groter.
maar volgens mij kijkt ie niet of het aantal records groter is dan nul, maar naar het getal wat eruit komt. Tenminste, dat probeerde ik met het eerste.
Nee, dat is wat jij probeert, maar niet goed doet. Hij doet iets heel anders.
En het werkt nu wel :)
Uit die van Ro krijg je altijd true, ook als die specifieke activatiesleutel niet bestond. Omdat er uit die select count(*) 1 record (in zo'n geval met het getalletje 0) komt en dat is meer dan 0 records.

Wat jij probeerde was op zich goed, maar je verzuimde te lezen wat de functie mysql_result eigelijk teruggaf met de parameters die jij gebruikte. Met maar 1 parameter naast de result-identifier geeft ie een array terug met alle velden van dat specifieke record (record 0 in jouw geval, de eerste). In dit geval zit er in dat record overigens maar 1 veld, maar dat maakt voor de vergelijking "array > 0" niet uit.
Je kon het op twee manieren oplossen:
if(mysql_result($result, 0, 0) > 0) is dan de netste, maar dit had ook gekund:
$row = mysql_result($result, 0);
if($row[0] > 0)

[ Voor 3% gewijzigd door ACM op 30-12-2004 10:49 ]


  • marcovtwout
  • Registratie: Juli 2004
  • Laatst online: 05-08 08:55
Volgens mij heb ik het probleem van het uitvoeren van if en else gevonden.
Hetzelfde stukje kwam ik nog een keer tegen in het bestand :X
En ik ben meestal wel netjes met mijn code.
Waarschijnlijk gekopieerd met de bedoeling er iets anders van te maken, ach ja.

Ik heb ondertussen zitten denken en dit leek me beter omdat het maar 1 query kost:

PHP:
1
2
3
4
5
6
7
8
9
10
11
$query = "UPDATE nb_klanten SET activatiecode=NULL,datum_geactiveerd=NOW(),IP_geactiveerd='" . $_SERVER['REMOTE_ADDR'] . "' WHERE emailadres='" . $emailadres . "' AND activatiecode='" . $activatiecode . "'";
mysql_query($query, $db);
echo mysql_affected_rows(); //test
if(mysql_affected_rows() > 0)
{
    $report = "goed";
}
else
{
    $report = "fout";
}


Alleen het vreemde is dat ie altijd 0 geeft als affected rows.

[ Voor 10% gewijzigd door marcovtwout op 30-12-2004 11:41 ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Er is nog altijd de mogelijkheid dat je query gewoon niet goed is, bijvoorbeeld omdat je parameters meegeeft die anders in de database opgeslagen zijn dan jij ze meegeeft.

Een van de mogelijke redenen is dat jij allerlei htmlencoding-dingen uithaalt ermee, terwijl dat voor SQL helemaal niet hoeft/hoort.
Echo je query naar het scherm en voer hem in de mysql-console/phpmyadmin/whatever uit. En meestal is het dan handiger om er een select van te maken, omdat er dan niks aan je database verandert en de wijzigingen in de update doorgaans weinig uitmaken als je al niet het goede record weet te selecteren :)

  • marcovtwout
  • Registratie: Juli 2004
  • Laatst online: 05-08 08:55
Ik weet zeker dat de query uitgevoerd wordt, dat zie ik gebeuren in phpmyadmin.
Als ik de query daar uitvoer krijg ik wel 1 affected row.
En die htmlencoding dingen, ik zal er naar kijken, maar het heeft hier geen invloed denk ik.
Alle gebruikte tekens zijn alfanumeriek.

[ Voor 34% gewijzigd door marcovtwout op 30-12-2004 11:55 ]


  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 25-10-2022

Banpei

Hachiroku on this touge?

marcovtwout schreef op donderdag 30 december 2004 @ 11:53:
Ik weet zeker dat de query uitgevoerd wordt, dat zie ik gebeuren in phpmyadmin.
Als ik de query daar uitvoer krijg ik wel 1 affected row.
En die htmlencoding dingen, ik zal er naar kijken, maar het heeft hier geen invloed denk ik.
Alle gebruikte tekens zijn alfanumeriek.
Wijzigt ie uberhaupt wel iets in die query, of blijven de variabelen in de tabel gelijk?
Note: When using UPDATE, MySQL will not update columns where the new value is the same as the old value. This creates the possibility that mysql_affected_rows() may not actually equal the number of rows matched, only the number of rows that were literally affected by the query.

AE86 gevonden! | So what I thought I'd do was, I'd pretend to be one of those deaf-mutes.


  • marcovtwout
  • Registratie: Juli 2004
  • Laatst online: 05-08 08:55
Jazeker wijzigt ie wat.

Acties:
  • 0 Henk 'm!

  • marcovtwout
  • Registratie: Juli 2004
  • Laatst online: 05-08 08:55
*schop*

iemand nog een verklaring waarom die telkens 0 affected teruggeeft?

Acties:
  • 0 Henk 'm!

  • kieltju
  • Registratie: Mei 2002
  • Laatst online: 15-09 21:52
ACM schreef op woensdag 29 december 2004 @ 19:51:

Overigens komt er uit mysql_result($result, 0) een array, geen getal. .
http://nl.php.net/manual/nl/function.mysql-result.php

Er staat hier niks over een array. Volgens mij was dat juist het leuke van mysql_Result, dat je gelijk heb wat je wil.

<Brrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr>


Acties:
  • 0 Henk 'm!

  • marcovtwout
  • Registratie: Juli 2004
  • Laatst online: 05-08 08:55
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?
$query = "UPDATE nb_klanten SET activatiecode=NULL,datum_geactiveerd=NOW(),IP_geactiveerd='" . $_SERVER['REMOTE_ADDR'] . "' WHERE emailadres='" . $emailadres . "' AND activatiecode='" . $activatiecode . "'";
mysql_query($query, $db);
echo mysql_affected_rows(); //test
if(mysql_affected_rows() > 0)
{
    $report = "goed";
}
else
{
    $report = "fout";
}
?>


Het gaat nu om dit stukje code.
In phpmyadmin zie ik dat de query uitgevoerd wordt.
Alleen mysql_affected_rows() geeft altijd 0.

Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

marcovtwout schreef op vrijdag 31 december 2004 @ 10:45:
*schop*

iemand nog een verklaring waarom die telkens 0 affected teruggeeft?
Ik lees in de comments bij de genoemde functie dat mysql_affected_rows soms 0 geeft als er een timestamp geupdate wordt?

Sundown Circus


Acties:
  • 0 Henk 'm!

  • marcovtwout
  • Registratie: Juli 2004
  • Laatst online: 05-08 08:55
Daar zeg je wat, misschien is dat net zo met DATETIME.
Ik zal dat stukkie eens uit de query verwijderen.

*geen resultaat
De onderste query geeft 1 row affected:

PHP:
1
2
//      $query = "UPDATE nb_klanten SET activatiecode=NULL,datum_geactiveerd=NOW(),IP_geactiveerd='" . $_SERVER['REMOTE_ADDR'] . "' WHERE emailadres='" . $emailadres . "' AND activatiecode='" . $activatiecode . "'";
        $query = "UPDATE nb_klanten SET activatiecode=NULL,datum_geactiveerd=NOW(),IP_geactiveerd='" . $_SERVER['REMOTE_ADDR'] . "' WHERE emailadres='" . $emailadres . "'";


en hier gaat het blijkbaar fout:

PHP:
1
AND activatiecode='" . $activatiecode . "'


om de een of andere duistere reden.
Ik echo emailadres en activatiecode, kloppen, de query wordt uitgevoerd.
Alleen 0 affected..

De datatypen van de kolommen emailadres en activatiecode zijn beide VARCHAR(30), emailadres NOT NULL en activatiecode NULL.

[ Voor 191% gewijzigd door marcovtwout op 03-01-2005 10:34 ]

Pagina: 1