[mysql+php]Vergelijking werkt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DoeEensGek
  • Registratie: Maart 2009
  • Laatst online: 13:34
Ik heb een probleempje.

Ik gebruik een kleine database.

Nu zit er een waarde in, welk moet worden verandert als erop geklikt wordt.

Standaard is de waarde 0. Klik ik op erop, opent hij een link (met id) en moet hij in 1 verandert worden. Daarna keer je weer terug naar overzicht en is het een 1. Klik je dan erop, 0 etc.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$resultaat  = mysql_num_rows( mysql_query( 'SELECT online FROM sat WHERE id = "' . mysql_escape_string( $_GET[ 'online' ] ) . '" LIMIT 1' ) );

    
    
    if( $resultaat >= 1 ) {
            mysql_query( 'UPDATE sat WHERE id = "' . mysql_escape_string( $_GET[ 'online' ] ) . '" SET online= "0" ' );
            
            echo 'De *** is succesvol aangepast......<br /><a href="overview.php">Ga terug!</a>';
            
            
    } else {
        mysql_query( 'UPDATE sat WHERE id = "' . mysql_escape_string( $_GET[ 'online' ] ) . '" SET online= "' . mysql_escape_string( '1' ) .  '" ' );
            
        echo 'De *** is succesvol aangepast.<br /><a href="overview.php">Ga terug!</a>';
    }


Maar nu, wat ik ook invul als waarde, hij geeft altijd "De *** is succesvol aangepast.....".
En past ook niks aan... Waar zitten mijn fouten?

Hij krijgt uit de url, ../status.php?online=*, het id nummer en overview.php heeft dus een kolom met nullen en éne die een id bevatten.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
mysql_num_rows() >= 0 is altijd waar, dus hij update steeds naar 0.:>

Indien niet waar, bestaat de row niet en slaat de update naar 1 ook nergens op. ;)

[ Voor 44% gewijzigd door Voutloos op 20-01-2011 20:45 ]

{signature}


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19:21

Dido

heforshe

En dan nog, als je al daadwerkelijk de waarde 1 of 0 gaat vergelijken is dat ook altijd >= 0 :)

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 15:24
Het is overigens aan te raden om mysql_real_escape_string() te gebruiken (mits je geen prepared statements wilt gebruiken). Zie http://stackoverflow.com/...-mysql-real-escape-string

Acties:
  • 0 Henk 'm!

  • DoeEensGek
  • Registratie: Maart 2009
  • Laatst online: 13:34
Heb hem weer even aangepast, had inderdaad nog de 0 staan om te testen. Maar er verandert totaal niks.
0 blijft 0, 1 blijft 1 en ook al het andere blijft zoals het is. Hij geeft wel die melding maar er gebeurt niks, daarbij krijg ik nooit de onderste melding...
(verder zoekende :)... )

Acties:
  • 0 Henk 'm!

  • brambo123
  • Registratie: December 2006
  • Laatst online: 18:41
Waarom eigenlijk gebruik je if?
je kunt toch ook !$resultaat gebruiken?
Als $resultaat = 1 dan !$resultaat = 0
probeer dit eens:
code:
1
2
3
4
5
$resultaat = mysql_fetch_array( mysql_query( 'SELECT online FROM sat WHERE id = "' . mysql_escape_string( $_GET[ 'online' ] ) . '" LIMIT 1' ) );

mysql_query( 'UPDATE sat WHERE id = "' . mysql_escape_string( $_GET[ 'online' ] ) .'" SET online="'.!(int)$resultaat[0] );

echo 'De *** is succesvol aangepast......<br /><a href="overview.php">Ga terug!</a>';


Krijg je als je "echo $resultaat" doet wel juiste waarde?

Edit: o wacht, heb je het over mysql_num_rows??
wil je het aantal rijen weten waar die je zoekt?
dacht dat je een waarde wilt weten? heb code hierboven even verandert.. misschien dat het werkt...

[ Voor 20% gewijzigd door brambo123 op 20-01-2011 22:06 ]


Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Ten eerste is het verstandig om op te zoeken wat mysql_num_rows precies doet (waar al eerder naar gehint werd).

Daarnaast laat je wel altijd zien dat het "succesvol" is aangepast, maar je controleert niet wat het resultaat is van de queries, dus het zou best zo kunnen zijn dat er wel fouten optreden.

Acties:
  • 0 Henk 'm!

Verwijderd

Kijk eens naar de syntax van het UPDATE statement, en vergelijk dat met wat je in je code hebt staan.

Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
$resultaat bevat het aantal rijen met de waarde $_GET['online'] als id, gelimiteerd door 1. (Ofwel, $resultaat is 0 of 1)

Als $resultaat 0 is,bestaan er geen rijen voor $_GET['online'] en valt er dus ook geen row te updaten.

Als $resultaat 1 is, dan wordt online altijd op 0 gezet.

Eindstand is dat dit script alleen rows kan aanpassen naar 0, en nooit naar 1.

Acties:
  • 0 Henk 'm!

  • DoeEensGek
  • Registratie: Maart 2009
  • Laatst online: 13:34
Verwijderd schreef op vrijdag 21 januari 2011 @ 09:14:
Kijk eens naar de syntax van het UPDATE statement, en vergelijk dat met wat je in je code hebt staan.
Je hebt gelijk, na het kijken zag ik dat ik SET naar voren moest schuiven. Daarmee een del opgelost! :)
ReenL schreef op vrijdag 21 januari 2011 @ 11:45:
$resultaat bevat het aantal rijen met de waarde $_GET['online'] als id, gelimiteerd door 1. (Ofwel, $resultaat is 0 of 1)

Als $resultaat 0 is,bestaan er geen rijen voor $_GET['online'] en valt er dus ook geen row te updaten.

Als $resultaat 1 is, dan wordt online altijd op 0 gezet.

Eindstand is dat dit script alleen rows kan aanpassen naar 0, en nooit naar 1.
Ik heb de term online inderdaad 2x gebruikt, ik heb nu de url 'status' genoemt ipv. 'online'. Waardoor hij deze 2 niet meer door elkaar haalt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$resultaat  = mysql_num_rows( mysql_query( 'SELECT online FROM sat WHERE id = "' . mysql_escape_string( $_GET[ 'status' ] ) . '" ' ) );

    
    
    if( $resultaat == 1 ) {
            mysql_query( 'UPDATE sat SET online= "0" WHERE id = "' . mysql_escape_string( $_GET[ 'status' ] ) . '" ' );
            
            echo 'De wedstrijd is succesvol aangepast......<br /><a href="matchesoverview.php">Ga terug!</a>';
            
            
    } else {
        mysql_query( 'UPDATE sat SET online= "1" WHERE id = "' . mysql_escape_string( $_GET[ 'status' ] ) . '" ' );
            
        echo 'De wedstrijd is succesvol aangepast.<br /><a href="matchesoverview.php">Ga terug!</a>';
    }


Nog één probleem, hij verandert de 1 in een 0, alleen de nul en al het andere niet in een 1. Hij pakt nooit de else...
Nog even verder zoeken dus. :+.

[ Voor 4% gewijzigd door DoeEensGek op 22-01-2011 10:22 ]


Acties:
  • 0 Henk 'm!

  • YakuzA
  • Registratie: Maart 2001
  • Niet online

YakuzA

Wat denk je nou zelluf hey :X

Zoals ook eerder gezegd: als er een 0 in je db staat, heb je nog steeds 1 row in je result.

het ligt dus aan de mysql_num_rows functie waar je de functie blijkbaar nog niet helemaal van door hebt :)

Death smiles at us all, all a man can do is smile back.
PSN


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21-09 21:47

Creepy

Tactical Espionage Splatterer

PHP:
1
if( $resultaat = 1 ) {

Is dit een typefout of staat het echt zo in je code? Een enkele =, is een toekenning. Een dubbele = is een vergelijking! (dus $resultaat == 1).

Als dit echt je probleem is, dan wordt het misschien eens tijd om (opnieuw) een goede PHP tutorial te doen of er een goed boek bij te pakken. Dit zou direct moeten opvallen met het probleem dat je nu hebt ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Lees mijn post nog een keer en vervang in het verhaal $_GET['online'] met $_GET['status']. Indien je een nieuwe post doet waarin je weer de variable veranderd, dan moet je weer die vervanging doen.

Nu even zonder dollen... Dit veranderd niets aan het verhaal (behalve de enkele '=').

Je probeert een row te updaten die niet bestaat. En als hij wel bestaat dan wordt hij _ALTIJD_ op 0 gezet.

Acties:
  • 0 Henk 'm!

  • DoeEensGek
  • Registratie: Maart 2009
  • Laatst online: 13:34
Oké ik zat dus met mijn mysql_num_rows totaal verkeert. Waarom ik die gebruikte, geen idee.

@creepy, ben er pas net mee begonnen, dankzij youtube al veel uitleg kunnen volgen, als mede vele tutorials op internet.

De enkele = is al een dubbel = geworden nog voor het uploaden, waarom dat bij mijn post een enkele = is geworden weet ik niet.

PHP:
1
$resultaat = mysql_fetch_array( mysql_query( 'SELECT online FROM sat WHERE id = "' . mysql_escape_string( $_GET[ 'status' ] ) . '" ' )) ;

Volgens mij zit het probleem daarin.

De bedoeling is dat hij bij het id 'x' het onder de rij 'online', de 0 of 1 verandert in een 1 of 0. Staat er een 1, wordt het 0, staat er een 0 wordt het een 1.
In de url staat het id nummer gemerkt als status='id-nummer'. Hij krijgt vanuit de url dus het id nummer aangevoerd.

Code zoals hij nu is:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$resultaat = mysql_fetch_array( mysql_query( 'SELECT online FROM sat WHERE id = "' . mysql_escape_string( $_GET[ 'status' ] ) . '" ' )) ;

    
    
    if( $resultaat == 1 ) {
            mysql_query( 'UPDATE sat SET online= "0" WHERE id = "' . mysql_escape_string( $_GET[ 'status' ] ) . '" ' );
            
            echo 'De wedstrijd is succesvol aangepast......<br /><a href="matchesoverview.php">Ga terug!</a>';
            
            
    } else {
        mysql_query( 'UPDATE sat SET online= "1" WHERE id = "' . mysql_escape_string( $_GET[ 'status' ] ) . '" ' );
            
        echo 'De wedstrijd is succesvol aangepast.<br /><a href="matchesoverview.php">Ga terug!</a>';
    }

Maar op deze manier pakt hij altijd de 'else', en update online in een 1 bij het betreffende id.

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Wat nou als je eens gaat debuggen. Wat zit er nou precies in $resultaat ($resultaat kan trouwens nooit 1 zijn omdat het een array is), zie ook: Programming FAQ - Algemeen - Tips bij debuggen

Lees ook Programming FAQ - PHP even door.


Even om een klein voorbeeldje te geven:
PHP:
1
2
3
4
5
6
7
8
<?php
$resultaat = array();

if($resultaat == 1) {
    echo "Ja";
} else {
    echo "Nee";
}

[ Voor 37% gewijzigd door Manuel op 22-01-2011 14:01 ]


Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
$resultaat['online']

[ Voor 60% gewijzigd door ReenL op 22-01-2011 23:17 . Reden: nu achter een pc ]


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
ReenL schreef op zaterdag 22 januari 2011 @ 22:26:
$resultaat('online') maar dan met brackets die zitten niet op mn phone
Weet je überhaupt wel hoe mysql_fetch_array werkt? mysql_fetch_array maakt gebruik van numerieke indexes (kort gezegd: $resultaat[n]) dus je moet het gebruiken via $resultaat[0] in dit geval. Als je het graag $resultaat["online"] wilt gebruiken dan gebruik je in dit geval mysql_fetch_assoc.

No offence maar dit is toch echt de basis van MySQL / PHP, als ik jou was zou ik nog even wat meer tutorials doornemen.

Acties:
  • 0 Henk 'm!

Verwijderd

Je kan dat LIMIT 1 net zo goed weghalen omdat het ID unique is en dus maar 1x voorkomt.

Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
quote: Manuel
Weet je überhaupt wel hoe mysql_fetch_array werkt? mysql_fetch_array maakt gebruik van numerieke indexes (kort gezegd: $resultaat[n]) dus je moet het gebruiken via $resultaat[0] in dit geval. Als je het graag $resultaat["online"] wilt gebruiken dan gebruik je in dit geval mysql_fetch_assoc.

No offence maar dit is toch echt de basis van MySQL / PHP, als ik jou was zou ik nog even wat meer tutorials doornemen.
Kijk nog een keer in de manual svp, jij hebt het over mysql_fetch_row.

Fetch array kan beide.

http://nl2.php.net/mysql_fetch_array
"Returns an array of strings that corresponds to the fetched row, or FALSE if there are no more rows. The type of returned array depends on how result_type is defined. By using MYSQL_BOTH (default), you'll get an array with both associative and number indices. Using MYSQL_ASSOC, you only get associative indices (as mysql_fetch_assoc() works), using MYSQL_NUM, you only get number indices (as mysql_fetch_row() works)."

Have fun met de manual lezen...

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
ReenL schreef op zaterdag 22 januari 2011 @ 23:19:
[...]

Kijk nog een keer in de manual svp, jij hebt het over mysql_fetch_row.

Fetch array kan beide.

http://nl2.php.net/mysql_fetch_array
"Returns an array of strings that corresponds to the fetched row, or FALSE if there are no more rows. The type of returned array depends on how result_type is defined. By using MYSQL_BOTH (default), you'll get an array with both associative and number indices. Using MYSQL_ASSOC, you only get associative indices (as mysql_fetch_assoc() works), using MYSQL_NUM, you only get number indices (as mysql_fetch_row() works)."

Have fun met de manual lezen...
* Manuel had erbij moeten zetten dat ik nu PDO / MySQLi gewend ben en dus geen oude mysql_* functies meer. (note for next time). Mijn fout, sorry.

Lees trouwens ook even Avalaxy zijn reactie:
Avalaxy schreef op donderdag 20 januari 2011 @ 21:01:
Het is overigens aan te raden om mysql_real_escape_string() te gebruiken (mits je geen prepared statements wilt gebruiken). Zie http://stackoverflow.com/...-mysql-real-escape-string

Acties:
  • 0 Henk 'm!

  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 21-09 11:30

Guldan

Thee-Nerd

Wat ook handig is is om een query op te volgende manier op te zetten:

PHP:
1
2
3
4
5
6
$query = "SELECT veld1,veld2,veld3 FROM tabel WHERE id=" . mysql_escape_string($_GET['id']);
$result = mysql_query($query);

while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
    printf("ID: %s  Name: %s", $row[0], $row[1]);  
}


Werkt je code dan niet dan kan je een print_r($query) toevoegen om het SQL statement uit te laten printen en dan kan je die met een programma als Navicad/Mysql Workbench runnen om te kijken of je sql iig klopt.

Verder ook eens met de heren hierboven. Je probeert iets te doen zonder de basis goed te snappen. Ga eens kijken hoe mysql_fetch_array precies werkt. Wat komt er uit wanneer je mysql_fetch_array gebruikt (hint: het zit in de naam van de functie).

[ Voor 18% gewijzigd door Guldan op 24-01-2011 15:56 ]

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


Acties:
  • 0 Henk 'm!

  • Mercatres
  • Registratie: September 2009
  • Laatst online: 19-09 19:50
En pas je code eens aan naar dit:
PHP:
1
mysql($query) or die(mysql_error());

[ Voor 25% gewijzigd door Mercatres op 24-01-2011 16:19 ]


Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 19:25
Guldan schreef op maandag 24 januari 2011 @ 15:53:
Wat ook handig is is om een query op te volgende manier op te zetten:

PHP:
1
2
3
4
5
6
$query = "SELECT veld1,veld2,veld3 FROM tabel WHERE id=" . mysql_escape_string($_GET['id']);
$result = mysql_query($query);

while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
    printf("ID: %s  Name: %s", $row[0], $row[1]);  
}


Werkt je code dan niet dan kan je een print_r($query) toevoegen om het SQL statement uit te laten printen
Lijkt me niet zo handig i.v.m. SQL-injection. Verder print je nu veld1 als ID, veld2 als Name en met veld3 doe je niets? Misschien komt dat door verwarring met de numerieke indices, wat meteen weer aangeeft waarom fetch_assoc makkelijker is. En $query is een string, dus met een simpele echo kom je ook al een heel eind.

Het was veiliger geweest om gewoon te zeggen "zet je query (string) in een variabele zodat je die kunt afdrukken om hem te inspecteren", maar dat staat volgens mij ook in de FAQ onder debuggen (zoals eerder genoemd).

Acties:
  • 0 Henk 'm!

  • DoeEensGek
  • Registratie: Maart 2009
  • Laatst online: 13:34
Inmiddels heb ik het kunnen oplossen. Ben totaal overnieuw begonnen. Heb me eerst totaal geconcentreerd op het verkijrgen van een $resultaat. Ben van 0 en 1 afgestapt en ze maar yes en no genoemd om iets minder te verwarren. Resultaat, staat er in de row bij id x een yes, wordt het een no als ik erop klik, en andersom.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
if( isset( $_GET[ 'status' ] ) ) {
    $resultaat =  mysql_query( 'SELECT * FROM sat WHERE id = "' . mysql_real_escape_string( $_GET[ 'status' ] ) . '"' );
    while ($row =  mysql_fetch_object($resultaat)){

        if($row->online == yes) {
            mysql_query( 'UPDATE sat SET online= "no" WHERE id = "' . mysql_real_escape_string( $_GET[ 'status' ] ) . '" ' );
            header("Location: matchesoverview.php"); 
        } else {
            mysql_query( 'UPDATE sat SET online= "yes" WHERE id = "' . mysql_real_escape_string( $_GET[ 'status' ] ) . '" ' );
            header("Location: matchesoverview.php"); 
        }   
    }
}


Bedankt voor alle hulp, dat ten eerste :).

Het is mijn eerste projectje en tot nu toe ging alles goed dankzij tutorials. Alleen liep ik hier dus vast omdat ik ervan uit ging dat dit:
PHP:
1
$resultaat = mysql_fetch_object(mysql_query( 'SELECT online FROM sat WHERE id = "' . mysql_real_escape_string( $_GET[ 'status' ] ) . '"' ))

dus ook zou werken. Dat doet het niet wat ik ook niet gelijk goed doorhad.
Zitten nog wel wat dingetjes in maar komen we rustig aan wel aantoe.

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Zet voor de grap eens boven in je code:
PHP:
1
define('yes', 'no');
en test 't dan nog 's?

't Is good practice om code met error_reporting op E_ALL volledig zonder notices en warnings te laten werken, omdat dat namelijk betere code oplevert. En van betere code worden we allemaal beter, want dan hoeven we voortaan alleen nog maar goede code van iemand anders te debuggen, en dat is altijd fijn. ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Mercatres
  • Registratie: September 2009
  • Laatst online: 19-09 19:50
En ik kan het niet meer benadrukken, gebruik alsjeblieft ook
PHP:
1
mysql_query($query) or  die(mysql_error());

Dat helpt ook alleen maar meer bij debuggen.

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

offtopic:
Gebruik nóg liever PDO met exceptions :) Dan zie je ook nog waar de error vandaan komt.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Mercatres
  • Registratie: September 2009
  • Laatst online: 19-09 19:50
offtopic:
Ja, dat is waar. Maar in dit probleem ging het om de mysql-lib ;)

Acties:
  • 0 Henk 'm!

  • Bender
  • Registratie: Augustus 2000
  • Laatst online: 16-09 09:15
PHP:
1
mysql_query("UPDATE sat SET online= IF (online = 'no', 'yes', 'no') WHERE id = " . (int)$_GET[ 'status' ] . " LIMIT 1");


Lijkt mij makkelijker dan 3 queries doen...

De (int) omdat ik 'denk' dat het een integer is of moet zijn.
De LIMIT zodat hij direct stopt met zoeken naar andere records (tenzij die er wel zijn natuurlijk)


Overigens zou ik eerder 1 en 0 gebruiken, scheelt ruimte, tinyint updaten is in theorie sneller dan een char() veld wijzigen, etc.
En ook je code wordt korter.
Pagina: 1