2009-08-08 7 views
1

Aidez-moi à écrire une fonction.Aide PHP/SQL avec fonction

function reportThread() { 
global $id; 

$result = mysql_query("SELECT is_checked FROM reports WHERE url = '?threadID=$id'"); 
$r = mysql_fetch_assoc($result); 

if ($r['is_checked'] == 0) { 

echo "<script type=\"text/javascript\">alert(\"A moderator has been notified.\");</script>"; 

mysql_query("INSERT INTO reports (url, userID) VALUES ('?threadID=$id', 1)"); 

} else echo "<script type=\"text/javascript\">alert(\"Theres already a pending report on this thread.\");</script>"; 

} 

Ce que je veux achive est que s'il y a une URL est que les rapports d'utilisateur dans la table avec is_checked = 0 je veux dire à l'erreur sinon je veux insérer!

Cela ne fonctionnera pas pour moi. Il insère toujours.

rapports:
id, url, is_checked (0 par défaut), userID

j'ai ... les dossiers

Répondre

3

En ce moment, vous êtes code insérait if ($r['is_checked'] == 0), qui est à l'opposé de ce que vous voulez. Mais ce n'est pas le seul problème.

Vous utilisez également l'opérateur d'égalité (==) au lieu de l'opérateur d'identité (===).

En PHP, 0 est une valeur falsifiée. Ainsi, sont les suivants:

  • "" (une chaîne vide)
  • 0 (0 sous forme d'entier)
  • "0" (0 sous forme de chaîne)
  • NULL
  • FALSE
  • array() (un tableau vide)
  • var $var; (une variable de claré, mais sans valeur dans une classe)

Donc, s'il n'y a pas de résultat (provoquera une NULL) ou is_checked est l'une de ces valeurs, en utilisant l'opérateur d'égalité fera votre véritable comparaison.

PHP: Comparison Operators

Qu'est-ce que vous voulez vraiment faire est de vérifier si la valeur est vraiment égale à 0, en tant que tel:

if (strval($r['is_checked']) !== '0') { 
    echo "<script type=\"text/javascript\">alert(\"A moderator has been notified.\");</script>"; 
    mysql_query("INSERT INTO reports (url, userID) VALUES ('?threadID=$id', 1)"); 
} else { 
    echo "<script type=\"text/javascript\">alert(\"Theres already a pending report on this thread.\");</script>"; 
} 

Mais puisque vous faites cela, pourquoi ne pas faire l'opération directement dans votre requête?

$result = mysql_query("SELECT is_checked FROM reports WHERE url = '?threadID=$id' AND is_checked = '0'"); 

// No Result? Continue 
if(mysql_num_rows($result) === 0) { 
    echo "<script type=\"text/javascript\">alert(\"A moderator has been notified.\");</script>"; 
    mysql_query("INSERT INTO reports (url, userID) VALUES ('?threadID=$id', 1)"); 
} else { 
    echo "<script type=\"text/javascript\">alert(\"Theres already a pending report on this thread.\");</script>"; 
} 
+0

merci beaucoup! –

0

Votre logique est guingois. Ce code insère si is_checked est égal à 0. Essayez ceci:

function reportThread() { 
global $id; 

$result = mysql_query("SELECT is_checked FROM reports WHERE url = '?threadID=$id'"); 
$r = mysql_fetch_assoc($result); 

if ($r['is_checked'] == 0) 
{ 
    echo "<script type=\"text/javascript\">alert(\"Theres already a pending report on this thread.\");</script>"; 
} 
else 
{ 
    mysql_query("INSERT INTO reports (url, userID) VALUES ('?threadID=$id', 1)"); 
    echo "<script type=\"text/javascript\">alert(\"A moderator has been notified.\");</script>"; 
} 
0

Vous pouvez éliminer la nécessité de vérifier le nombre de lignes tout à fait si vous voulez simplement pour la requête d'agir comme un opérateur booléen. Utilisez une fonction d'agrégat au lieu de la colonne is_checked seule, et ainsi la requête retournera toujours une seule ligne et elle sera toujours au moins 0.Et si vous supprimez la colonne is_checked et de supprimer la partie URL de la colonne user_id (ont juste que la production dans une autre requête lorsque vous en avez besoin), vous obtenez quelque chose de beaucoup plus léger:

Exemple:

<script type="text/javascript"> 
alert(" 
<?php 
$results = mysql_query("SELECT COUNT(threadID) AS counter FROM reports 
      WHERE threadID = '$id'"); 

while($count = mysql_fetch_assoc($results)) { 
     $checked = ($count > 0) ? TRUE : FALSE; 
} 

if($checked) { 
    echo "There is already a pending report on this thread."; 
} 
else { 
    mysql_query("INSERT INTO reports (threadID, userID) VALUES ('$id', 1)"); 
    echo "Theres already a pending report on this thread."; 
} 
?> 
"); 

Avis que l'exemple ci-dessus suppose que vous avez déjà échappé à PHP, afficher le javascript (ce qui élimine le besoin d'écho redondant des balises de script), et alors vous commencez simplement le php où l'alerte doit être remplie.