2010-03-26 7 views
1

Je suis un vrai débutant avec PHP et MySQL. Maintenant, je travaille sur le code suivant qui devrait chercher dans la base de données par exemple. tous les Lennons vivant à Liverpool.Problèmes de débutant avec MySQL et php

1) Comment modifier "get.php" pour que le texte "aucun résultat" apparaisse s'il n'y a pas de résultats de recherche.

2) Comment est-ce que je devrais modifier "index.php" pour obtenir les valeurs d'option (ville et nom) directement de la base de données au lieu d'avoir à les taper un par un?

3) Est-ce que j'utilise mysql_real_escape_string dans le bon sens?

4) Y a-t-il d'autres erreurs dans le code?

index.php:

<form action="get.php" method="post"> 
    <p> 
     <select name="city"> 
      <option value="Birmingham">Birmingham</option> 
      <option value="Liverpool">Liverpool</option> 
      <option value="London">London</option> 
     </select> 
    </p> 
    <p> 
     <select name="lastname"> 
      <option value="Lennon">Lennon</option> 
      <option value="McCartney">McCartney</option> 
      <option value="Osbourne">Osbourne</option> 
     </select> 
    </p> 
    <p> 
     <input value="Search" type="submit"> 
    </p> 
</form> 

get.php:

<?php 
$city = $_POST['city']; 
$lastname = $_POST['lastname']; 

$conn = mysql_connect('localhost', 'user', 'password'); 
mysql_select_db("database", $conn) or die("connection failed"); 
$query = "SELECT * FROM users WHERE city = '$city' AND lastname = '$lastname'"; 
$result = mysql_query($query, $conn); 

$city = mysql_real_escape_string($_POST['city']); 
$lastname = mysql_real_escape_string($_POST['lastname']); 

echo $rowcount; 
while ($row = mysql_fetch_row($result)) 
{ 
    if ($rowcount == '0') 
     echo 'no results'; 
    else 
    { 
     echo '<b>City: </b>'.htmlspecialchars($row[0]).'<br />'; 
     echo '<b>Last name: </b>'.htmlspecialchars($row[1]).'<br />'; 
     echo '<b>Information: </b>'.htmlspecialchars($row[2]); 
    } 
} 

mysql_close($conn); 
?> 
+0

Il est un peu tard pour échapper à votre poste variables lorsque vous avez déjà fait la requête. Déplacez-les au-dessus de la ligne de requête $. – Anthony

Répondre

0

1) la variable $ rowcount n'est pas définie. Faites quelque chose comme ceci:

$zerorows=true; 
while ($row = mysql_fetch_row($result)) 
{ 
    $zerorows=false; 
    echo '<b>City: </b>'.htmlspecialchars($row[0]).'<br />'; 
    echo '<b>Last name: </b>'.htmlspecialchars($row[1]).'<br />'; 
    echo '<b>Information: </b>'.htmlspecialchars($row[2]); 
} 
if($zerorows) echo "no results"; 

2) les sélectionner dans la db et les écrire dans le code HTML

<select><?php 
$q=mysql_query(...); 
while($row=mysql_fetch_row($q)) 
echo "<option>".$row[0]."</option>"; 
?></select> 

3) Vous devez utiliser la fonction avant que la requête:

$query = "SELECT * FROM users WHERE city = '".mysql_real_escape_string($_POST['city'])."' AND lastname = '".mysql_real_escape_string($_POST['lastname'])."'"; 

4) Essayez le code. Il est difficile de trouver des erreurs sans test.

-2
  1. mettre votre rowcount $ checkinfg de while.
  2. ne sélectionnez-le dans la base de données
  3. pas, mal e façon très drôle :)
+2

Pas une réponse très utile –

+0

@andy Pas un commentaire très instructif, hehe :) –

+2

Lol - bien 1. votre premier point n'a pas beaucoup de sens, même si je sais ce que vous voulez dire - peut-être "vérifier la valeur de $ rowcount en dehors de la boucle while "? 2. OP sait déjà qu'il en a besoin dans la base de données et demande comment le faire. 3. Quelle est la bonne façon? ;-) –

1

Vous devez utiliser mysql_real_escape chaîne avant vous envoyez une requête à la base de données.

0

Vous avez quelques erreurs dans get.php. Voici une version correcte modifiée.

<?php 
$city = mysql_real_escape_string($_POST['city']); 
$lastname = mysql_real_escape_string($_POST['lastname']); 

$conn = mysql_connect('localhost', 'user', 'password') or die("Connection failed"); 
mysql_select_db("database", $conn) or die("Switch database failed"); 
$query = "SELECT * FROM users WHERE city = '$city' AND lastname = '$lastname'"; 
$result = mysql_query($query, $conn) or die("Query failed"); 
$rowcount = mysql_num_rows($result); 

if ($rowcount == 0) 
{ 
    echo 'no results'; 
} 
else 
    while (($row = mysql_fetch_row($result)) !== false) 
    { 
     echo '<b>City: </b>'.htmlspecialchars($row[0]).'<br />'; 
     echo '<b>Last name: </b>'.htmlspecialchars($row[1]).'<br />'; 
     echo '<b>Information: </b>'.htmlspecialchars($row[2]); 
    } 
} 

mysql_close($conn); 
?> 
  • $rowcount est non défini - Je l'ai fait ce tirer le nombre de lignes de votre jeu de résultats
  • Vous ne avez pas fuyez vos variables POST qu'APRÈS que tu avais fait la requête - vous devez les faire avant
  • Vous vérifiaient la $rowcount dans la requête while - s'il n'y avait pas de lignes retournées, la boucle while ne courrait pas si cette vérification ne se produirait pas
  • Vous ne avez pas vérifié le résultat de l'appel mysql_fetch_row pour arrêter correctement l'exécution si plus d'enregistrements sont récupéré
  • Vous ne avez pas avoir vérifié que la connexion et la requête a été fait avec succès
  • Vous compariez un entier ($rowcount) avec une chaîne ('0') - cela aurait travaillé en raison de la façon dont PHP des types de données sont traitées, mais il lit mieux si vous obtenez vos données-types droit

Une autre suggestion est d'utiliser mysql_fetch_assoc en place de mysql_fetch_row - il vous permettra de référencer vos champs de résultat par nom - par exemple $row['city'] donc si vous ré-commandez les colonnes de votre table, cela ne cassera pas votre application.

0

Depuis que votre utilisateur a soumis la ville et le nom, il est un peu inutile de faire écho à chaque itération de la boucle. Donc, la meilleure façon d'aller serait d'avoir le retour de requête SQL « aucun résultat » s'il n'y a pas de résultats, et d'imprimer seulement la ville/lastname au-dessus de la boucle:

<?php 
$city = mysql_real_escape_string($_POST['city']); 
$lastname = mysql_real_escape_string($_POST['lastname']); 

$conn = mysql_connect('localhost', 'user', 'password'); 
mysql_select_db("database", $conn) or die("connection failed"); 
$query = "SELECT COALESCE(information,"No Results") AS information FROM users 
      WHERE city = '$city' AND lastname = '$lastname'"; 
$result = mysql_query($query, $conn); 

while ($row = mysql_fetch_row($result)) 
{ 
echo '<b>Information: </b>'.htmlspecialchars($row[0]); 
} 
mysql_close($conn); 
?>