2011-10-25 2 views
2

J'ai établi le code PHP suivant qui traite les données d'une forme de la manière suivante:Quel est le meilleur moyen de valider une liste de valeurs?

  1. Ajoute tous les noms sont entrés dans un tableau.
  2. Vérifie si l'un des noms est dans une table MySQL.
  3. Si ce n'est pas le cas, renvoie une erreur.
  4. Si oui, ajoute des données à une colonne appelée «atelier» dans le tableau pour les noms soumis.
$emailFrom = ""; 
$emailTo = ""; 
$subject = "Booking(s) for Workshop"; 

$body = "The following people have booked their workshops:" . "\n\n"; 

$row_count = count($_POST['name']); 
if ($row_count > 0) { 

mysql_select_db($database, $connection); 
$name = array(); 
$workshop = array(); 

for($i = 0; $i < $row_count; $i++) { 
// variable sanitation... 
$name[$i] = mysql_real_escape_string(ucwords($_POST['name'][$i])); 
$workshop[$i] = mysql_real_escape_string($_POST['workshop'][$i]); 
} 
$names = "('".implode("','",$name)."')"; 
$query = "SELECT 1 FROM conference WHERE Name In $names"; 
$result = mysql_query($query); 

if ($result) { 
    $rowcount = mysql_num_rows($result); 

if ($rowcount == 0) { 
     $errorString = "No bookings found"; 
} 
else { 
for($i = 0; $i < $row_count; $i++) { 
$sql = "UPDATE conference SET Workshop = '$workshop[$i]' WHERE Name LIKE '$name[$i]'"; 
mysql_query($sql); 
     } 
    } 
    } 
} 

include 'workshops.php'; 

// send email 
$success = mail($emailTo, $subject, $body, "From: <$emailFrom>"); 

// redirect to success page 
if ($success){ 
    print "<meta http-equiv=\"refresh\" content=\"0;URL=thanks-workshop.html\">"; 
} 
else{ 
    print "<meta http-equiv=\"refresh\" content=\"0;URL=error.htm\">"; 
//} 

La question que je suis maintenant face est de savoir comment ajouter un contrôle d'erreur plus sophistiqué. Je veux que PHP vérifie chaque nom soumis sur le formulaire. S'il trouve tous les noms, soumettez les données à la colonne de l'atelier. Si aucun nom n'est trouvé, le message d'erreur serait "Les noms suivants n'ont pas été trouvés sur notre base de données: [noms listés]". L'utilisateur serait alors obligé d'entrer les noms corrects ou supprimer les noms fautifs, avant que le formulaire puisse être soumis. J'ai eu la tête dans un peu d'enchevêtrement en essayant de trouver comment y parvenir.

Dois-je exécuter une requête distincte sur la première boucle pour chaque nom, puis si le nom n'est pas trouvé dans la table, ajoutez ce nom à une variable qui serait alors incluse dans le message d'erreur? Ensuite, si après toutes les boucles la variable d'erreur est "", le formulaire pourrait être soumis (parce que tous les noms ont été trouvés), mais sinon le message d'erreur montrerait les noms qui ont besoin d'être modifiés?

Serait-ce la meilleure méthode, ou existe-t-il un meilleur moyen?

Répondre

1

Je dois dire désolé. Je suppose que vous envoyez tous les noms par POST.

Voici la deuxième solution, essayez:

$not_in = Array(); 

// lets say all names doesn't exist in `conference` 
foreach($name as $value) { 
    // names in array are keys, not values 
    $not_in[$value] = true; 
} 


$query = mysql_query("SELECT Name FROM conference WHERE Name IN $names"); 
while(list($dbname) = @mysql_fetch_row($query)) { 
    // delete those name from $not_in who exists 
    unset($not_in[$dbname]); 
} 

// names in $not_in array are keys, not values 
$not_in = array_keys($not_in); 

if(empty($not_in)) { 
    // its ok, all names have been found. do the magic. 
}else{ 
    $errorString = 'The following names have not been found on our database: '.join(', ',$not_in); 
} 
+0

Merci pour votre aide Cela fonctionne bien. Entaille – Nick

0

Utiliser l'expression NOT IN() dans votre requête SQL:

$query = mysql_query("SELECT Name FROM conference WHERE Name NOT IN $names"); 
$not_in = Array(); 
while(list($name) = @mysql_fetch_row($query) { 
    $not_in[] = $name; 
} 

if(empty($not_in)) { 
    // its ok, all names have been found. do update. 
}else{ 
    $errorString = 'The following names have not been found on our database: '.join(', ',$not_in); 
} 

Il est tout au sujet de la logique:

"Si elle trouve tous les noms, (...)"

vous devriez penser de cette façon:

"Si pas trouve tous les noms, (...)"

+0

Merci Peter. On dirait qu'il y avait une parenthèse manquante à la fin de votre ... ligne. J'ai une erreur d'analyse jusqu'à ce que je l'ajoute. Maintenant, quand j'essaye de soumettre le formulaire je reçois le message d'erreur "Les noms suivants n'ont pas été trouvés ...." et une liste de tous les noms sur la base de données qui n'ont pas été inclus dans le formulaire (c.-à-d. !), il semblerait donc qu'il y ait encore un problème logique! Pourriez-vous me dire ce que cela pourrait être? Merci, Nick – Nick

+0

S'il vous plaît donnez-moi ce SQL "SELECT Nom FROM conférence WHERE Nom NOT IN $ noms". Je veux savoir la valeur des noms $. – Peter

+0

Bonjour Peter. La valeur dans $ names est les noms qui sont entrés dans le formulaire, à partir de cette ligne: '$ names =" ('".implode ("', '", $ name)."') ";' So "SELECT Name FROM conference WHERE Nom NOT IN $ names "renvoie tous les noms de la colonne Nom de ma table qui ne sont pas entrés dans le formulaire. – Nick

Questions connexes