webForumDet fria alternativet

mysql_num_rows gillas inte

22 svar · 555 visningar · startad av Rickard

RickardMedlem sedan maj 2001287 inlägg
#1

Tjena!

Har ett litet problem här och hoppas på lite hjälp...
Försöker att räkna IP'n i en databas, meningen är att den skall lagra unika IP'n...
Finns ip't redan, så läggs det inte in någon info.
Finns inte ip't, så läggs det in...

Försöker med följande kod...

<?

$u_ip = $_SERVER['REMOTE_ADDR'];

$link = mysql_connect ("server","user","pass");
$databas = mysql_select_db("databas");
$in_use_query = mysql_query("SELECT unique FROM log WHERE ip = '$u_ip'", $link);
if(mysql_num_rows($in_use_query)) {
     error_message("IP redan räknat");
        exit;
}
$sql="INSERT INTO log (ip)
VALUES('$u_ip')";
mysql_query("$sql");
mysql_close ($link);
?>

Men jag får detta fel:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/user/log/unique.php on line 7

Någon som kan hjälpa mig och förklara vad som är fel, och ev. en lösning på felet?
Vore tacksam för hjälp =)

aasahMedlem sedan mars 20034 471 inlägg
#2

Det betyder att det är något fel på din SQL-sats. Eftersom det blir fel, skickas inget "resurs-handtag" tillbaka...

Lägg till en felutskrift:

$in_use_query = mysql_query("SELECT unique FROM log 
      WHERE ip = '$u_ip'", $link) or die(mysql_error());

OBS slutet på raden! Så får du ut ett detaljerat meddelande om vad det är MySQL inte gillar.

RickardMedlem sedan maj 2001287 inlägg
#3

Tack...

Dock kan jag inte tyda problemet trots det...

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 'unique FROM log WHERE ip = 'xxx.xxx.xxx.xxx' at line 1

Bara för att kolla mig själv nu..
Jag gissar på att felet ligger till vänster om "unique", men bara för att kolla så det inte är till höger...
Databasen heter 7324-1..
Tabellen heter unique och fältet som skall kollas heter "ip"..
där det står "log" var förvisso fel, det var tabellen ovan.
Jag har bytt ut log mot unique, ip och 7324-1 utan något bättre resultat, så det bör väl inte vara fel till höger om unique?

RickardMedlem sedan maj 2001287 inlägg
#4

Ok...
Lyckades hitta problemet.. mysql_db_query skulle det tydligen vara...
Nu har jag dock ett annat problem som jag inte fattar mig på.. nu krafsar jag mig verkligen i skallen...

$in_use_query = mysql_db_query("SELECT ip FROM unique WHERE ip = '$u_ip'", $link) or die(mysql_error());

Nu får jag istället detta fel...

Incorrect database name 'SELECT ip FROM unique WHERE ip = 'xxx.xxx.xxx.xxx'

Som sagt, databasen = 7324-1, tabell = unique, fältet som skall kollas = ip
:q

aasahMedlem sedan mars 20034 471 inlägg
#5

Läste visst inte själva SQL-strängen sist... Du har en tabell som heter unique??? :o Undra på att det blir problem! unique är ett reserverat ord i SQL, byt namn på tabellen!

Exempel:
Anställd ((personnr), anställningsnr, namn, lön, ....) där både personnr och anställningsnr är unikt. För att beskriva för SQL att icke-nyckelvärdet anställningsnr är unikt så definieras den kolumnen till att vara unique. På samma sätt som man kan stoppa null-värden med NOT NULL o dyl.

RickardMedlem sedan maj 2001287 inlägg
#6

ahh.. där ser man...
Döpte om unique till unik_ip men har dock samma problem hur jag än byter om i sql strängen...

RickardMedlem sedan maj 2001287 inlägg
#7

Testade bara på skoj att ta byta tillbaks mysql_query från mysql_db_query, och nu funkade det...
Alltid lär man sig nåt nytt.. =)
Tack för hjälpen med allt det andra.. =)

RickardMedlem sedan maj 2001287 inlägg
#8

Ytterligare en fråga då.. känns onödigt att öppna en ny tråd...
i tabellen "log" finns det ett fält som heter "referer" som fylls med "HTTP_REFERER".
Det är ju inte alltid man kommer in på sidan från en länk, så den är ju tom ibland.

går det, och i så fall hur, att sortera ut alla toma fält i qeryn, så att man vid visning av tabellen på en sida enbart ser de fält som är fyllda?

aasahMedlem sedan mars 20034 471 inlägg
#9

Rickard skrev:

... i tabellen "log" finns det ett fält som heter "referer" som fylls med "HTTP_REFERER".
.... går det, och i så fall hur, att sortera ut alla toma fält i qeryn, så att man vid visning av tabellen på en sida enbart ser de fält som är fyllda?

Frågan är vad som lagras där när inget fylls i? Har den kolumnen något defaultvärde som "" (tom sträng) eller lagras där absolut inget?

Testa att lägga in
WHERE (referer <> "" AND referer <> NULL) i din SQL-fråga om du inte vet svaret på frågan ovan. Annars tar dessa två villkor bort för de respektive fallen.

RickardMedlem sedan maj 2001287 inlägg
#10

Vist ska väl det ligga i SELECT satsen?
Jag får ett fel jag inte kan reda ut när jag lägger till det där...

$sql = "SELECT referer FROM log WHERE (referer <> "" AND referer <> NULL) ORDER BY id DESC LIMIT $start,$limit" or die(mysql_error());

Felet jag får är:

Parse error: parse error, unexpected '\"'

Jag kan då inte de en \" någonstans på den raden...

red:
$start och $limit tillhör det pagingscript jag har inlaggt för att bryta upp till max 20 poster/sida.

aasahMedlem sedan mars 20034 471 inlägg
#11

Förlåt mig! Jag tänkte mig inte för när jag skrev. Strängar i SQL avgränsas med ' inte ". Dessutom "or die" har du där strängen körs, inte i sql-frågan. Ändra till:

$sql = "SELECT referer FROM log 
            WHERE (referer <> '' AND referer <> NULL) 
            ORDER BY id DESC LIMIT $start,$limit";
$res = mysql_query($sql) or die(mysql_error());

Felet jag får är:

Parse error: parse error, unexpected '\"'

Jag kan då inte de en \" någonstans på den raden...

Felet kommer från PHP, inte MySQL. Din fråga når aldrig längre än till att PHP hittar:

"SELECT referer FROM log WHERE (referer <> "

Aha! Strängslut. Nästa tecken ska då vara antingen ';' (slut på sats) eller '.' (konkatinera ihop med resten). Men nästa tecken är ett citationstecken, unexpected ". Och så escape:as det: \" ==> felmeddelandet.

Det blir mycket lättare att läsa din kod om du använder php-taggen:

Skriv PHP-kod här

i stället för

Annan kod

. Åstadkoms med (utan mellanslagen) [ PHP] [ /PHP] i stället för [ KOD][ /KOD].

RickardMedlem sedan maj 2001287 inlägg
#12

Tackar.. =)
Nu vart jag av med felen iaf, tyvärr så sopade den bort ALLT som står i referer, så den visar nada.. ;)

aasahMedlem sedan mars 20034 471 inlägg
#13

Den sopar avgjort inte bort något. Ingenting ändras av en SELECT-sats. Om inget kommer ut betyder det antingen att innehållet inte ser ut som du tror, eller att frågan är fel.

Hur ser det ut utan WHERE-satsen då? Är du säker på att det ligger något i log?

RickardMedlem sedan maj 2001287 inlägg
#14

jag menade förståss inte att det sopar bort ur databasen, utan snarare filtrerar bort allt... =)
Jag skickar dig ett privat meddelande med länken till hela scriptet, så får du se vad som finns i databasen.. =)
Utan WHERE satsen visar den rubbet, både toma och fyllda fält...

aasahMedlem sedan mars 20034 471 inlägg
#15

Vad får du ut om du skriver

$sql = "SELECT referer, id FROM log 
            WHERE (referer <> '' AND referer <> NULL) 
            ORDER BY id DESC LIMIT $start,$limit";
$res = mysql_query($sql) or die(mysql_error());

Testa!

Förresten! Vad är värdena på $start, $limit? Vad skriver följande ut:

$sql = "SELECT referer, id FROM log 
            WHERE (referer <> '' AND referer <> NULL)";
$res = mysql_query($sql) or die(mysql_error());

Testa! Och svara.

RickardMedlem sedan maj 2001287 inlägg
#16

Precis detsamma som tidigare...
Absolut ingenting...

aasahMedlem sedan mars 20034 471 inlägg
#17

Rickard skrev:

Precis detsamma som tidigare...
Absolut ingenting...

Även det nedre förslaget? Jag börjar misstänka att problemet kan vara ditt sorteringskriterium...

RickardMedlem sedan maj 2001287 inlägg
#18

hmm...
Jag tar å pillar ihop en liten phps.. orkar du ta dig en fluktare då tro? =)

K@llenMedlem sedan mars 20032 667 inlägg
#19

Skriv alltid ut din sql-fråga i felsökningssyfte om du skickar med variabler:

$sql = "SELECT referer, id FROM log 
WHERE (referer <> '' AND referer <> NULL)";
echo $sql;
//$res = mysql_query($sql) or die(mysql_error());

Sedan kan det mycket väl vara så att kolumnen referer innehåller blanksteg. Då uppfylls inte dina villkor.

$sql = "SELECT referer, id FROM log 
WHERE LENGTH(trim(referer)) > 0  AND referer IS NOT NULL";
$res = mysql_query($sql) or die(mysql_error());
aasahMedlem sedan mars 20034 471 inlägg
#20

phps? :q Vet inte vad du menar riktigt. Men problemet ligger inte i PHP:n nu, utan i att få din SQL fråga att funka. Såvida inte... hur använder du svaret från queryn?

Det du vill ha ut ligger i $res[0] (om resurs-handtaget heter $res.)

Om mitt nedre förslag inte heller funkar och du skriver ut $res[0], pröva att skriva bara :

$sql = "SELECT referer FROM log";
$res = mysql_query($sql) or die(mysql_error());

Då ska du få ut allt.

Jag loggar ut och går och lägger mig nu, var uppe halva natten igår... Lycka till! :D

256 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
118 ms — hämta statistik (db)
135 ms — hämta tråd, inlägg och bilagor (db)