2009-08-01 12 views
0

im ayant du mal à obtenir les données de deux tables séparéesInterroger deux tables dans une mysql requête

Jusqu'à présent, je cette

<? 
include('config.php'); 
$xid = $_GET['xid']; 

$result = mysql_query("SELECT * FROM `config`") or trigger_error(mysql_error()); 
while($row = mysql_fetch_array($result)){ 
foreach($row AS $key => $value) { $row[$key] = stripslashes($value); } 

$result = mysql_query("SELECT * FROM `utinfo` WHERE `xid` = $xid") or trigger_error(mysql_error()); 
while($row2 = mysql_fetch_array($result)){ 
foreach($row2 AS $key => $value) { $row2[$key] = stripslashes($value); } 
$un = urldecode($row2['un']); 
}; 

switch ($row['module']) 
{ 
case 1: 
    echo "Function 1 for user $uid on account $un"; 
    break; 
case 2: 
    echo "Function 2 for user $uid on account $un"; 
    break; 
case 3: 
    echo "Function 3 for user $uid on account $un"; 
    break; 
default: 
    echo "No module defined."; 

}; 
}; 
?> 

La configuration de la table de configuration a les lignes modules nommés, et son peuplée par 2 entrées, dont l'un est 1, l'autre 3. Donc, je devrais voir le cas 1, puis le cas 3. Mais tout im est l'écho par défaut. Stripslashes() est utilisé sur les chaînes.

Répondre

0

Vos valeurs de cas sont des entiers. Il semble que vous ayez une incompatibilité de type ici?

0
  1. Pourquoi n'utilisez-vous pas PDO? Vous devriez vraiment standardis sur PDO si vous le pouvez.
  2. Les noms de table dans SQL select ne doivent pas être indiqués.
  3. Vous devriez envisager d'utiliser des instructions préparées afin d'éviter l'injection SQL et vous n'avez pas à vous soucier d'avoir à citer vos paramaters
+2

Dans MySQL vous pouvez (et parfois devez) enfermer des noms de tables dans des guillemets (qui ressemblent à des guillemets). –

+0

Ah ... cool! Je ne le savais pas. – Kitson

0

La première réponse est probablement correcte en ce qui concerne les incompatibilités de type, vous devriez être en mesure pour résoudre le problème en utilisant le code suivant:

switch ((integer) $row['module']) 

Voir les éléments suivants: http://us.php.net/manual/en/language.types.type-juggling.php#language.types.typecasting

Alternativement, vous pouvez essayer ceci:

settype($row['module'], "integer"); 

switch ($row['module']) 

Voir: http://us.php.net/manual/en/function.settype.php

Je suggère également echo'ing la valeur de $ row [ 'module'] sur la page, pour vérifier qu'il est bien un entier.

2

(Ce n'est pas une réponse à l'OP, mais quelque chose que vous devriez vraiment se soucier, donc je pense que ça vaut writting il)

Il semble qu'il y ait une énorme injection SQL dans votre code.

La façon normale d'appeler votre page serait avec quelque chose comme "xid=5" dans l'URL, pour obtenir des informations de l'utilisateur # 5.

Maintenant, supposons que quelqu'un donne "xid=5 or 1=1". La requête résultante serait:

SELECT * FROM `utinfo` WHERE `xid` = 5 or 1=1 

La condition est toujours vraie; vous obtiendriez des informations sur TOUS les utilisateurs sous la forme d'une sortie, tout en parcourant le jeu de résultats.

Autre possibilité: "xid=5; delete from utinfo;"; qui donnerait cette requête:

SELECT * FROM `utinfo` WHERE `xid` = 5; delete from utinfo; 

Ce videraient votre table :-(


Vous devez toujours échapper/vérifier/sanitize/Tout ce que vous les données avant de les mettre dans une requête SQL, en particulier (mais pas seulement) si elles proviennent d'un utilisateur de l'application.

Pour les chaînes, voir la fonction mysql_real_escape_string.
Pour que les données soient Sould entiers, vous pouvez utiliser intval (dans le pire des cas, si les données n'étaient pas valides, vous obtiendrez 0, ce qui pourrait n'obtenir aucun résultat de la DB, mais, au moins, ne le cassera pas ^^)

Une autre solution serait d'utiliser préparé déclarations mais ceux qui ne sont pas disponibles avec la fonction mysql_*: vous devez passer à l'une ou l'autre

Quoi qu'il en soit, pour une nouvelle application, vous ne devriez pas utiliser mysql_*: il est vieux , et n'obtient pas de nouvelles fonctionnalités/améliorations que mysqli et PDO obtiennent ...

Questions connexes