2012-01-24 2 views
1

J'ai été aux prises avec ce problème pendant quelques jours et je ne peux pas faire de progrès ... J'essaie d'obtenir un seul résultat de ma base de données, mais au contraire, je '' m obtenir toute la table: (Android Mysql - trop de résultats

php:

{ 
    $connect = @mysqli_connect ($host, $username, $pass, $dbname) 
    OR die ('Could not connect to MySQL'); 

    $table = $_REQUEST['table']; 
    $key = $_REQUEST['id']; 
    $key_value = $_REQUEST['id_value']; 

    $q = "SELECT * FROM ".$table." where ".$key."='".$key_value."'"; 
    $r = @mysqli_query ($connect, $q); 

    while ($row = mysqli_fetch_array($r)) 
     $output[]=$row; 
    print(json_encode($output)); 
} 

Je pense qu'il n'y a pas besoin de vous montrer mon code pour Android que, depuis la réception des données bien (mise à jour aussi des tables fonctionne très bien) ... Tout ce que je veux, c'est obtenir un résultat de ma base de données.

Lorsque vous naviguez simplement vers ce fichier sur le navigateur, il n'y a pas de problème évidemment ... Merci d'avance, bravo

+1

Ce n'est pas une réponse, mais vous ne devriez pas utiliser de vieilles valeurs passées à partir d'une requête, car quelqu'un malin passe quelque chose de malveillant. – Jim

Répondre

1

Vous faites quelque chose comme where 1 = 1 et c'est toujours vrai. Vous ne nommez pas votre colonne. Vous remplacez cela par un nombre.

essayer (non vérifiées):

"SELECT * FROM ".$table." where id='".$id."'"; 
+0

Et qu'est-ce que cela va faire? En quoi est-ce différent de ce qu'il fait déjà? –

+0

@juergend est correct, c'est différent, l'original n'a pas la colonne id = $ id, il a deux fois la variable, donc ce sera quelque chose comme: select * de la table où 5 = 5; –

+0

Désolé, mon erreur - n'a pas lu le code du demandeur assez attentivement. Cependant, cela n'aide pas la question dans la question. –

0

Si vous voulez obtenir juste la première ligne des résultats, vous avez deux options:

  1. comprennent LIMIT dans votre requête (préféré solution)

    SELECT * FROM ". $ table." où ». $ id. "= '". $ id."' LIMIT 1"

  2. faire boucle de ne pas obtenir toutes les données, il suffit de lire la première ligne et le retourner.

+0

Lire la première ligne et la renvoyer est mauvaise, car vous avez encore beaucoup de surcharge du côté de la base de données. –

+0

Je suis totalement d'accord - c'est pourquoi j'ai déclaré que (1) est la solution préférée. En réalité, il peut y avoir des cas valides où vous devez interroger la table entière et retourner ensuite seulement la première rangée: habituellement quand vous devez faire quelque chose avec le reste des données mais n'avez pas besoin de l'afficher.Je ne connais pas la logique de son programme, alors je l'ai suggéré comme option. –

0

vous définissez votre condition where ".$id."='".$id."'";, donc, si vous passez id = 1, qui signifie:. WHERE 1=1, et qui est toujours vrai c'est pourquoi il est de retour tous les enregistrements

+0

J'ai fait une erreur ci-dessus, bien sûr le programme va comme: SELECT * FROM table où key = 'key_value' mais même avec le mot-clé LIMIT 1 le tableau revient avec tout le contenu de la table .. même si je boucle les résultats d'autres résultats sont repris? l'ID dans la base de données est uniqe pour evry row ... – user1167309

+0

pouvez-vous faire 'echo $ q' pour voir à quoi ressemble votre requête après son chargement? – jere

0
$table = $_REQUEST['table']; 
    $key = $_REQUEST['id']; 
    $key_value = $_REQUEST['id_value']; 

    $q = "SELECT * FROM ".$table." where ".$id."='".$id."'"; 

Nous assignons. $ key et $ key_value mais en utilisant $ id

+0

J'ai fait une erreur ci-dessus, bien sûr le programme va comme: SELECT * FROM table où key = 'key_value' mais même avec le mot-clé LIMIT 1 le tableau revient avec tout le contenu de la table .. même si je boucle les résultats d'autres résultats sont repris? l'ID dans la base de données est uniqe pour evry row ... – user1167309