hoi allemaal

ik voer een query uit enzo in mysql. maar hoe kun je nou controleren of de query ook resultaat wordt geleverd.
bijv ik voer in dat ie bij ID 29 moet kijken wat er staat. Maar wat als ID 29 niet bestaat? dan weergeeft ie niets :S

hoe kan je dit controleren

grtz :)
<?php
$sql = 'SELECT * FROM tabel WHERE id = 29';
$result = mysql_query($sql) or trigger_error(mysql_error());
if(mysql_num_rows($result) > 0){
print_r(mysql_fetch_assoc($sql));
}
?>

SELECT
  COUNT(1) AS aantal
FROM
  tabelnaam
WHERE
  id = 29

Deze query levert jou het exacte aantal records op dat aan deze voorwaarde voldoet. Dat zal waarschijnlijk 0 of 1 zijn. Deze query is sneller dan de query van Eris, het is een slimmere vraag: Hoeveel records voldoen aan de eis dat het id gelijk is aan 29.

Ik hoop wel dat je verder geen enkele betekenis aan het getal 29 toekent, met een id herken je uitsluitend een uniek nummer. Zet hier gewoon een auto_increment op en jij hoeft je helemaal nergens zorgen over te maken. Hopelijk roep ik hier dingen die jij ook al weet, dat scheelt een hoop problemen.
Frank schreef op 17.11.2006 20:28

SELECT
  COUNT(1) AS aantal
FROM
  tabelnaam
WHERE
  id = 29

Deze query levert jou het exacte aantal records op dat aan deze voorwaarde voldoet. Dat zal waarschijnlijk 0 of 1 zijn. Deze query is sneller dan de query van Eris, het is een slimmere vraag: Hoeveel records voldoen aan de eis dat het id gelijk is aan 29.

Ik hoop wel dat je verder geen enkele betekenis aan het getal 29 toekent, met een id herken je uitsluitend een uniek nummer. Zet hier gewoon een auto_increment op en jij hoeft je helemaal nergens zorgen over te maken. Hopelijk roep ik hier dingen die jij ook al weet, dat scheelt een hoop problemen.


Het gaat er denk ik om dat er ook gegevens moeten worden gevonden met het record, dus dat je bijvoorbeeld de naam weer wilt geven van de gebruiker met id=29
Dan is de oplossing van Eris toch echt beter, binnen de if heb je dan de data die weergegeven wordt, en in de else de melding voor als er geen records zijn gevonden.
@Robert: je kon wel eens gelijk hebben, ik krijg het idee dat ik niet helemaal goed heb gelezen. Gelukkig is de TS in elk geval geholpen!
hoe maak je dat ie ipv id 29 die niet bestaat id 23 uit de database pakt als standaard ?

ik had dit:
<?php
$sql ="SELECT * FROM database WHERE id = '".mysql_real_escape_string(addslashes($_GET['id']))."'";
$res = mysql_query($sql);
if($res){$rij = mysql_fetch_assoc($res);}else{$rij = 23;}if(mysql_num_rows($res) < 0){$rij = 23;}?>

maar als ik bij $_GET['id'] 329408 invoer dan krijg ik een lege query. Hij moet bijv een titel op mn webpagina weergeven maar daar staat dan helemaal niets $rij['titlel'] gebruik ik hiervoor
<?php
$sql ="SELECT * FROM database WHERE id = '".mysql_real_escape_string(addslashes($_GET['id']))."'";
$res = mysql_query($sql);
if($res){
$rij = mysql_fetch_assoc($res);
}

else{
$sql= "SELECT * FROM database WHERE id =23";
//verdere uitvoer van de query
}
?>
Deze is eenvoudiger, je hebt slechts 1 query nodig en 1 goede controle op de input:
<?php
$default = 1;
if(isset($_GET['id']) && ctype_digit($_GET['id'])){
$id = $_GET['id'];
}
else {
$id = $default;
}
$sql ="
SELECT
*
FROM
tabelnaam
WHERE
id =
CASE
WHEN id = '".$id."' THEN '".$id."'
ELSE '".$default."'
END
";
$res = mysql_query($sql);
if($res){
$rij = mysql_fetch_assoc($res);
}
else {
echo 'Query mislukt vanwege de volgende fout: '.mysql_error().$sql;
}
?>
Edit: CASE in de query gezet met een fraaie default waarde in het geval de opgegeven GET niet bestaat.
@frank
is ctype_digit hetzelfde als is_numeric?
nicky schreef op 17.11.2006 20:44
@frank
is ctype_digit hetzelfde als is_numeric?

Nee, zie de verschillende resultaten:
1) De integer 23 levert een FALSE op met ctype_digit en een TRUE met is_nummeric.
2) De string 23 levert in beide gevallen een TRUE op
3) De integer 23.1 levert een FALSE op met ctype_digit en een TRUE met is_nummeric.
4) De string 23.1 levert een FALSE op met ctype_digit en een TRUE met is_nummeric.

Kortom, er zitten flinke verschillen in. Wanneer je de gegevens met $_GET ophaalt, worden deze als een string aangeleverd. ctype_digit() voldoet dan uitstekend.
Frank en als id 29 niet in de db staat dan zal je het toch met 2 query's moeten doen...

Reageren