2009-07-09 6 views
1

vérifier,php débutant question. si les déclarations

i ont cette table

tablename: rapports
id (AI)
contenu (varchar),
contentID (int),
vérifié (tinyint)

if (isset($_GET['reportPost'])){ 

$query = mysql_query("select * from reports where contentID = $_GET[reportPost]"); 
$report = mysql_fetch_assoc($query); 

if (!mysql_num_rows($query) && $report['checked'] == 0) { 
echo 'There is already a pending report on this object.'; 
} else { 
header("Refresh: 2; url=showthread.php?id=$id"); 
echo '<div class="successMsg">Thanks for your report!</div>'; 
mysql_query("insert into reports..."); 
} 

} 

Ce que je veux réaliser avec ce code est que s'il y a déjà un enregistrer dans les rapports avec contentID = $ _GET [reportPost] et est checked = 0 Je ne veux pas que cela s'exécute. Le code ci-dessus ne le fera pas.

Une aide serait beaucoup appriciated :)

+3

Votre requête est ouverte à l'injection SQL. Vous devriez toujours valider les données $ _GET et $ _POST avant de les placer dans une requête. –

+0

Ou échappez-le correctement - ne faisons pas strstr() pour UPDATE, DELETE et amis :-) –

Répondre

0

Peut être vous devriez essayer:

if (mysql_num_rows($query) && $report[0]['checked'] == 0) { 

?

+0

négatory. fetch_assoc renvoie la première ligne de l'ensemble. – davethegr8

0

Une combinaison de ...

$query = mysql\_query("select * from reports where contentID = $\_GET[reportPost] AND checked<>0"); 
$report = mysql\_fetch\_assoc($query); 

if (!mysql_num_rows($query) || $report['checked'] == 0) { 
    echo 'There is already a pending report on this object.'; 
} else { 
    ... 
} 

avis la deuxième clause WHERE et || au lieu de & &

0

Je voudrais ajouter votre état de vérifié dans l'instruction SQL:

$query = mysql_query("select * from reports where contentID = '" . $_GET[reportPost] . "' AND checked = 0"); 

Maintenant, vous obtenez seulement des enregistrements dans le résultat si elles sont vérifiées, donc il vous suffit de tester le nombre de lignes dans la réponse à votre requête.

if (!mysql_num_rows($query)) { 

Espérons que cela aide.

+2

Cela inclut toujours une erreur d'injection SQL et n'a pas de guillemets autour de la chaîne soumise par l'utilisateur. Sans parler de l'utilisation de {} s dans les chaînes qui est un perlisme :-) –

+0

True. Pour être sûr, vous devez utiliser des guillemets. Je me concentrais davantage sur la question, mais vous avez raison et j'ai corrigé vos arguments. – txwikinger

5
  1. $_GET["reportPost"] doit sortir de la chaîne. Je ne pense pas que PHP échappe correctement, et en tout cas c'est une mauvaise pratique même avec des variables simples. Vous voulez sans doute faire ceci:

     
    $query = mysql_query("select * from reports where contentID = '" . mysql_real_escape_string($_GET[reportPost]) . "';");
    protection par injection SQL de base jetés pour :-) gratuitement

  2. Essayez-vous de vérifier si nous ne récupérons les données, puis de tenter de vérifier ce que nous les cheveux?

     if (!mysql_num_rows($query) && $report['checked'] == 0) {
    Cela ne semble pas correct. Comme suggéré par d'autres, soit remplacer & & avec ||, ou la négation (!) Doit aller.

Oh, en passant, je vous recommande de jeter un oeil à PDO. Plus pratique, et facilite le passage à un autre backend de base de données

EDIT: J'ai oublié d'ajouter des guillemets autour de la chaîne générée par mysql_real_escape_string(). Je suppose que je suis gâté par PDO où $ db-> quote() et les requêtes paramétrées le font automagiquement ...

+0

Pour 1 .: En effet, PHP voit '$ _GET', puis un littéral '[" reportPost "]'. Vous pouvez, cependant, utiliser des accolades comme celle-ci: '{$ _GET ['" reportPost "]}' – Boldewyn

+0

Ce qui laisse toujours le problème de l'injection SQL, ainsi que l'entrée de l'utilisateur entourant des guillemets simples. À moins que l'entrée ait déjà été nettoyée au-dessus du morceau de code que nous regardons :-) –

0

pourquoi pas seulement:

$query = mysql_query("select * from reports where contentID = $_GET[reportPost] and checked = 0"); 
$report = mysql_fetch_assoc($query); 

if (mysql_num_rows($query)) { 
echo 'This object is already been reported but not dealt with.'; 
} else { 
.... 
} 
Questions connexes