Als combinatie bestaat, dan A, anders B
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?
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
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)
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)
Als je array leeg is, dan heeft de query ook geen resultaten opgeleverd dus je zou je (RESOURCE $res) kunnen controleren met 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
bedankt voor je suggestie.
Ik ben begonnen met het proberen te tellen van het aantal rijen.
Code (php)
1
2
3
4
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.".");
$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)
1
2
3
4
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.".");
$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)
1
2
3
4
5
6
7
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.".");
(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
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);
}
?>
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);
}
?>
Hoi Rens, gaan we proberen. Had je mijn update in de vorige post al meegepikt in je antwoord?
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
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
De andere query: blij te horen dat hij valide is. Alleen is het resultaat nog steeds niet wat ik ervan verwacht.
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
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?
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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';
}
?>
$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
En de tabelstructuur....
tabel (Rating_ID, Rating_GameID, Rating_Date, Rating_IP, Score)
lijkt me te kloppen....
een nieuwe inval:
Code (php)
1
2
3
4
5
6
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.".");
(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
volgens mij zit je onwijs moeilijk te doen :-) omschrijf nog eens wat je nou exact wilt selecteren?
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.
maar dan is de opzet van je eerste query (in je vraag dus) toch goed? probeer het scriptje dat ik hierboven heb gezet even
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)
1
2
3
4
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'].")
(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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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';
}
?>
$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
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....
Dan kunnen er überhaupt geen dubbele waardes in komen.