Als combinatie bestaat, dan A, anders B

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Jeroen

Jeroen

29/05/2009 21:05:00
Quote Anchor link
Ik wil een module toevoegen, waarmee je een bepaald object kunt raten.
Inmiddels ben ik zover dat men een score kan toevoegen. Van alle scores worden IP, objectID en score in een tabel opgeslagen.

Nu wil ik graag zorgen dat er per IP adres slechts één score per object kan worden toegekend, dus:

ALS "(IP+object) reeds in tabel" DAN "sorry, mag niet" ANDERS "doorgaan".

Ik vermoed dat het in SQL iets is als
$res=mysql_query(SELECT *
FROM tabel
WHERE
IP = $IP
AND
OBJECT_ID=$ID);
$check=mysql_fetch_array($res);

Maar hoe check ik dan of deze array leeg is?
 
PHP hulp

PHP hulp

15/01/2025 09:18:29
 
Emmanuel Delay

Emmanuel Delay

29/05/2009 21:08:00
Quote Anchor link
Zet de ip in die tabel op UNIQUE.

Wanneer je dan nog een insert doet met een ip dia al in de tabel te vinden is, zal de record niet worden toegevoegd en zal de insert dus eel false weergeven.

Let er wel op dat verschillende gebruikers de zelfde ip kunnen hebben.
Gewijzigd op 01/01/1970 01:00:00 door Emmanuel Delay
 
Jeroen

Jeroen

29/05/2009 21:13:00
Quote Anchor link
Hallo Emmanuel,

bedankt voor je suggestie, maar helaas doet die niet precies wat ik wil: de IP is niet uniek.
Alleen de combinatie IP+ObjectID moet uniek zijn (er zijn meerdere objecten waarvoor men een score kan geven)
 
Danny Roelofs

Danny Roelofs

29/05/2009 21:19:00
Quote Anchor link
Als je array leeg is, dan heeft de query ook geen resultaten opgeleverd dus je zou je (RESOURCE $res) kunnen controleren met mysql_num_rows

Mijn tip: de bron van php, php.net biedt je ook veel antwoorden op allerlei oplossingen (er zijn daar ook gebruikers reacties op functies)
Gewijzigd op 01/01/1970 01:00:00 door Danny Roelofs
 
Jeroen

Jeroen

31/05/2009 10:19:00
Quote Anchor link
Hallo Danny,
bedankt voor je suggestie.

Ik ben begonnen met het proberen te tellen van het aantal rijen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$result = mysql_query("SELECT * FROM tabel WHERE ".$ID."!='null' AND ".$Rating_IP."!='null'");
$num_rows = mysql_num_rows($result);

echo("Aantal rijen: ".$num_rows.".");


Maar dit levert helaas een lege string op.

Hetzelfde probleem doet zich voor bij
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$result = mysql_query("SELECT * FROM wgf_Games_RATED WHERE ".$Rating_GameID." is not null AND ".$Rating_IP." is not null");
$num_rows = mysql_num_rows($result);

echo("Aantal rijen: ".$num_rows.".");


php.net, w3school.org en google leveren helaas geen antwoord op waar ik iets mee kan...


==========================
Update
==========================

Een andere poging:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
$res1 = mysql_query ("SELECT * FROM tabel_Rated WHERE ID NOT IN
                        (SELECT ID FROM tabel)
                            AND
                    IP NOT IN (SELECT IP FROM tabel)");
$rijtjes= mysql_num_rows($res1);

echo ("rijtjes: ". $rijtjes.".");


levert me de uitvoer "0" op. Een stap in de goede richting, want het is een getal. Alleen... hoe kan hij nu zeggen dat er nul rijen zijn...

Als ik de tabel leeghaal, zegt hij "0".
Als ik er vervolgens rijen aan toevoeg, blijft hij "0" zeggen.

Why?
Gewijzigd op 01/01/1970 01:00:00 door Jeroen
 
Rens nvt

Rens nvt

31/05/2009 10:26:00
Quote Anchor link
Heej Jeroen,

mysql_num_rows zal inderdaad false returnen (dus geen lege string, maar de boolean false) wanneer er geen resultaat is. En dit resultaat is er niet omdat je query fout gaat schat ik in.

Het is erg belangrijk om fouten af te vangen in je code. Probeer eens:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
    ini_set('display_errors', true);
    error_reporting(E_ALL | E_STRICT);

        // Hier je database verbinding maken
    $query = "SELECT * FROM wgf_Games_RATED WHERE ".$Rating_GameID." is not null AND ".$Rating_IP." is not null";
    $res = mysql_query($query, $connection);
    if (!$res)
    {

        echo mysql_error();
    }

    else
    {
        echo mysql_num_rows($res);
    }

?>
 
Jeroen

Jeroen

31/05/2009 10:37:00
Quote Anchor link
Hoi Rens, gaan we proberen. Had je mijn update in de vorige post al meegepikt in je antwoord?
 
Rens nvt

Rens nvt

31/05/2009 10:44:00
Quote Anchor link
nee :p Maar je hebt nu blijkbaar wel een valide query in elkaar gezet :-)

Maar om even terug te komen op het UNIQUE voorstel, waarom maak je geen unique aan op basis van die 2 kolommen??? Daarmee zeg je in de database dat de combinatie van die 2 uniek moet zijn...
Gewijzigd op 01/01/1970 01:00:00 door Rens nvt
 
Jeroen

Jeroen

31/05/2009 10:46:00
Quote Anchor link
Output op jouw stukje:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.117.83 is not null' at line 1
 
Jeroen

Jeroen

31/05/2009 10:49:00
Quote Anchor link
Dubbele Unique: kan dat dan zodanig dat de bezoeker een nette melding krijgt, ipv een of andere enge code?

De andere query: blij te horen dat hij valide is. Alleen is het resultaat nog steeds niet wat ik ervan verwacht.
 
Jeroen

Jeroen

31/05/2009 10:52:00
Quote Anchor link
Geniaal moment, en $query = "SELECT * FROM wgf_Games_RATED WHERE ".$Rating_GameID." is not null AND ".$Rating_IP." is not null";

veranderd in:
$query = mysql_query("SELECT * FROM wgf_Games_RATED WHERE ".$Rating_GameID." is not null AND ".$Rating_IP." is not null");

Ik krijg nu wederom steeds de melding dat

Query was empty

Ook bij de ID's waar nog geen eerdere ratings op zaten...

vreemd
 
Jeroen

Jeroen

31/05/2009 11:07:00
Quote Anchor link
Een nieuwe ontdekking.
Als ik mijn query run met ipv NOT IN de term IN, dan geeft hij de output 26

Dit is precies het aantal rijen in de tabel.
Dit suggereert dat hij de WHERE clausule niet meeneemt....

ideeën?
 
Rens nvt

Rens nvt

31/05/2009 11:18:00
Quote Anchor link
Jeroen: graag je bericht bewerken als er nog niemand anders gepost heeft, anders ben je aan het bumpen, en dat is niet toegestaan hier.

Klopt je tabelstructuur + input in de query wel met het doel dat je wilt bereiken?

Edit: Ik lees nu de post nog eens, en volgens mij moet je zoiets hebben:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$query
= " SELECT IP FROM tabel WHERE IP='123.123.123.123' AND object='2' ";
$res = mysql_query($query, $connection);
if ($res && mysql_num_rows($res) == 1)
{

echo 'bestaat al';
}

elseif ($res)
{

echo 'bestaat nog niet';
}

else
{
echo 'query ging fout';
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Rens nvt
 
Jeroen

Jeroen

31/05/2009 11:19:00
Quote Anchor link
Okay, excuses daarvoor :)

En de tabelstructuur....
tabel (Rating_ID, Rating_GameID, Rating_Date, Rating_IP, Score)

lijkt me te kloppen....

een nieuwe inval:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
$res1 = mysql_query ("SELECT * FROM wgf_Games_Rated WHERE Rating_GameID IN
    (SELECT Rating_GameID FROM wgf_Games_Rated WHERE Rating_GameID= ".$_POST['Rating_GameID'].")
AND
  Rating_IP IN (SELECT Rating_IP FROM wgf_Games_Rated WHERE Rating_IP= ".$_POST['Rating_IP'].")");

echo ("rijtjes MET IP en ID combo: ".$rijtjes.".");


Hieraan is toegevoegd de WHERE voorwaarde in de nested queries. Immers, de rij van de query moet natuurlijk wél de ID bevatten die we zoeken.

Maar, nu krijg ik een erg onverwachte melding:


Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/vhosts/webgamefavorites.com/httpdocs/wgf/givescore.php on line 53
rijtjes MET IP en ID combo: .Query was empty
Gewijzigd op 01/01/1970 01:00:00 door Jeroen
 
Rens nvt

Rens nvt

31/05/2009 11:29:00
Quote Anchor link
volgens mij zit je onwijs moeilijk te doen :-) omschrijf nog eens wat je nou exact wilt selecteren?
 
Jeroen

Jeroen

31/05/2009 11:32:00
Quote Anchor link
Ik wil uiteindelijk:

ALS combinatie IP+ID bestaat --> MELDING FOUT
ANDERS Doorgaan met proces.

De route die ik hiervoor probeer te volgen is:
tel aantal rijen met IP+ID combinatie

ALS aantal rijen >0 --> fout, anders goed.
 
Rens nvt

Rens nvt

31/05/2009 11:33:00
Quote Anchor link
maar dan is de opzet van je eerste query (in je vraag dus) toch goed? probeer het scriptje dat ik hierboven heb gezet even
 
Jeroen

Jeroen

31/05/2009 11:45:00
Quote Anchor link
Jouw script beantwoord me:
Query was empty

Dat is eigenlijk niet vreemd, want die zoekt alleen rijen waar de ID of de IP leeg is, maar moet natuurlijk zijn waar ID = a en IP = b

Als ik daar mijn query indump, krijg ik een mooi wit scherm. Maar
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT * FROM wgf_Games_Rated WHERE Rating_GameID NOT IN
                        (SELECT Rating_GameID FROM wgf_Games_Rated WHERE Rating_GameID= ".$_POST['Rating_GameID'].")
                            AND
                    Rating_IP NOT IN (SELECT Rating_IP FROM wgf_Games_Rated WHERE Rating_IP= ".$_POST['Rating_IP'].")


voelt ook net niet goed aan als query.
Je selecteert hier alles, gefilterd. GameID != de ID op deze pagina, IP!=de eigen IP.
Maar is die koppeling er eigenlijk...? Of filtert hij nu eerst alles weg waar de ID in zit, om vervolgens van de overgebleven rijen alles weg te filteren waar het IP in zit...?

Dus bijvoorbeeld, filterend op A en B

A B <- weg in eerste selectie (want A, terecht)
A C <- weg in eerste selectie (want A,onterecht)
A D <- weg in eerste selectie (want A,onterecht)
A B <- weg in eerste selectie (want A,terecht)

A1 B <- Weg in tweede selectie (want B, onterecht)
A1 B <- Weg in tweede selectie (want B, onterecht)
A1 C blijft
A1 B <- Weg in tweede selectie (want B, onterecht)
A1 D blijft
A1 B <- Weg in tweede selectie (want B, onterecht)

Als dit het geval is, dan blijven er slechts 2 rijen over, terwijl er slechts twee rijen de combinatie A B hebben....

Edit: moet er helaas vandoor.... later verder proberen
Gewijzigd op 01/01/1970 01:00:00 door Jeroen
 
Rens nvt

Rens nvt

31/05/2009 11:46:00
Quote Anchor link
Dit script controleert niet op lege rijen hoor:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$query
= " SELECT IP FROM tabel WHERE IP='123.123.123.123' AND object='2' ";
$res = mysql_query($query, $connection);
if ($res && mysql_num_rows($res) == 1)
{

echo 'bestaat al';
}

elseif ($res)
{

echo 'bestaat nog niet';
}

else
{
echo 'query ging fout';
}

?>

let wel, het gaat hier om de structuur, zelf ff kolom- en tabelnamen aanpassen
Gewijzigd op 01/01/1970 01:00:00 door Rens nvt
 
Jeroen

Jeroen

31/05/2009 15:05:00
Quote Anchor link
Hallo Rens,

weer mijn dank.

Op zich ziet dit eruit als iets dat ik begrijp...

regel 4;
Als er een $res bestaat én het aantal rijen dat dit resultaat oplevert is gelijk aan één, dan zeggen dat hij reeds bestaat. Anders, als er een $res is, maar die is ongelijk aan één, dan aangeven dat hij nog niet bestaat. En anders is er echt iets fout.

Maar wat zou er in dit script gebeuren als er op de een of andere manier twee rijen zijn? Dan zou je dus de "bestaat nog niet" regel krijgen, waardoor er uiteindelijk NOG een regel wordt toegevoegd. Of begrijp ik dit verkeerd?

Overigens is de output van dit script
Quote:
Query ging fout


No matter wat ik doe. Als ik de tabel leeg, dan krijg ik de melding dat de query fout ging. Als er een regel is, dan gaat er iets fout, als er meer regels zijn gaat het fout....
 
Hipska BE

Hipska BE

31/05/2009 16:12:00
Quote Anchor link
Ik weet niet of het al gepasseerd is, maar je kan ook op een combinatie van 2 kolommen een UNIQUE key zetten.

Dan kunnen er überhaupt geen dubbele waardes in komen.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.