2016-12-16 2 views
-3

Je suis nouveau à PHP mais normalement capable de résoudre la plupart des problèmes mais celui-ci m'a eu. J'essaie de créer un bulletin d'inscription (champ unique) avec un bouton de soumission unique. J'ai bien fonctionné, en envoyant un email et en insérant les données du formulaire dans ma table. Cependant, je souhaite ajouter une fonctionnalité pour envoyer un e-mail de confirmation à la personne qui s'inscrit. J'ai fait des recherches approfondies et je connais la méthode derrière cela, mais mon code n'entraîne pas de données dans ma deuxième table utilisée pour stocker les informations de confirmation.INSERT INTO ne fonctionne pas pour la 2ème table

J'ai 2 tables: Tableau 1 colonnes 'newsletter' nommés sont:

idmail,emailaddress,datetime,state 

idmail est réglé sur AUTO_INCREMENT

Tableau 2 nommée colonnes 'CONFIRM' sont:

idconfirm,emailaddress,confirmkey 

Voici mon code (j'ai omis la partie email qui va après que tout fonctionne bien):

//connect to database 
include('admin/connection.php'); 
$email = mysqli_real_escape_string($dbc, $_POST['email']); 
//check if value exists in table 
$result = mysqli_query($dbc, "SELECT emailaddress FROM newsletter WHERE emailaddress = '$email'"); 
if (mysqli_num_rows($result)==0) { 

//Insert value into database 
$query1 = mysqli_query($dbc, "INSERT INTO newsletter(emailaddress, datetime, state) VALUES('$email','$now','0')"); 
mysqli_query($dbc, $query1); 

// Get ID of last record 
$id = mysqli_insert_id($dbc); 

//Create a random key 
$hash = $email.date('mY'); 
$hash = md5($hash); 
//Insert value into database 
$query2 = mysqli_query($dbc, "INSERT INTO confrim(idconfirm, emailaddress, confirmkey) VALUES('$id','$email','$hash')"); 
mysqli_query($dbc, $query2); 

Lorsque je soumets une adresse e-mail, la première table est remplie correctement.

L'objectif ici est d'obtenir l'ID automatique créé dans la première requête INSERT INTO dans une variable, puis de l'ajouter dans la deuxième colonne de tables nommée 'idconfim'.

J'ai essayé:

echo $id; 
echo $email; 
echo $hash; 

et toutes les variables contiennent les informations correctes.

Quelqu'un a-t-il des idées? J'ai essayé de faire beaucoup de choses ici, mais j'ai fait des recherches et je ne sais pas où je me trompe.

Merci d'avance.

+1

Tout d'abord: 'INSERT INTO confrim' ->' INSERT INTO confirm' – lubilis

+0

Exécutez la requête directement sur phpmyadmin et consultez le message. –

+1

Votre script risque d'être attaqué par [SQL Injection Attack] (http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) Regardez ce qu'il est advenu de [ Little Bobby Tables] (http://bobby-tables.com/) Même [si vous échappez aux entrées, ce n'est pas sûr!] (Http://stackoverflow.com/questions/5741187/sql-injection-that-gets -around-mysql-real-escape-string) Utilisez [instructions paramétrables préparées] (http://php.net/manual/fr/mysqli.quickstart.prepared-statements.php) – RiggsFolly

Répondre

2

L'un des problèmes est que vous ne montrez pas l'erreur MySQL, s'il y en a une. Donc, vous devez soit vérifier les journaux du serveur pour l'erreur en PHP, vous pouvez forcer d'imprimer l'erreur dans le journal d'erreur ou faire quelque chose d'autre:

par exemple:

mysqli_query($dbc, $query2) or error_log(mysqli_error($dbc)); 

mysqli_query($dbc, $query2) or custome_error_handler(mysqli_error($dbc)); 

En plus php devrait être renvoyer une erreur HTTP au client. Vous devriez attraper cette erreur. Une fois que vous voyez l'erreur SQL, il sera facile de comprendre ce que vous avez mal fait.

EDIT Fred ii a attrapé l'erreur réelle, mais je pense que l'erreur aurait été jeté la première fois l'erreur est faite:

mysqli_query($dbc, $query1); 

$query1 est pas une chaîne. Et si vous avez remarqué que vous avez déjà exécuté la requête sur la ligne ci-dessus. La lecture des journaux d'erreurs PHP vous montrera exactement où se trouve l'erreur.

+2

"Je pense" n'est pas vraiment une réponse (je pense, est plus un commentaire). Regardez à nouveau leur code; J'ai décrit ce qui ne va pas mais je n'ai pas répondu, craignant un possible trou de lapin. –

+0

C'est un bon point, de toute façon en lisant les journaux d'erreurs aurait conduit le programmeur au problème que vous venez de signaler. –

+0

Vous êtes techniquement correct, à propos de l'utilisation de 'mysqli_error()' qui les aurait clairement jetés une erreur. –

5

Je souhaite publier mes commentaires comme une réponse ici:

Le problème ici est ce $query2 = mysqli_query($dbc,... '$hash')"); mysqli_query($dbc, $query2); et vous devriez avoir obtenu une erreur à ce sujet. Cela en plus de la faute de frappe possible pour le nom de la table confrim.

Vous devez supprimer mysqli_query($dbc, $query2); ici et le remplacer par:

if($query2){ echo "Success"; } 

else{ echo "Error: " . mysqli_error($dbc); 

(Une autre édition): Vous avez fait la même erreur ici:

$query1 = mysqli_query($dbc, "INSERT INTO newsletter ... '$now','0')"); 
mysqli_query($dbc, $query1); 

et doit être changé:

if($query1){ echo "Success"; } 

else{ echo "Error: " . mysqli_error($dbc); 

Comme indiqué dans les commentaires par RiggsFolly; n'utilisez pas MD5 pour hacher les mots de passe, ce n'est plus sûr. Beaucoup d'eau coule sous le pont depuis plus de 30 ans.

Utilisez password_hash()http://php.net/manual/en/function.password-hash.php et une instruction préparée.

Editer: Il me semble maintenant qu'après avoir regardé votre code, que vous n'essayez pas d'enregistrer un mot de passe, mais plus comme une clé de confirmation. Si tel est le cas, vous pouvez ignorer le mot de passe. Toutefois, si vous décidez d'utiliser MD5 pour stocker des mots de passe dans le futur, ce n'est pas le cas pour .

+1

Typo Confirmer. Quel oeil. (Y) –

+1

@NanaPartykar Typo pour la table "peut-être" ;-) encore l'utilisation de 2x 'mysqli_query()' est en effet un autre problème et un gros problème. –

+0

Vous pensez que le mot de passe hash n'est pas un mot de passe. Réaction Knee jerk .... en mettant l'accent sur _jerk_ bien sûr – RiggsFolly

-3

Désolé pour votre temps libre.

Merci à jeffery_the_wind de m'avoir indiqué les journaux. Je vais les utiliser à l'avenir.

Le problème était DEUX fautes d'orthographe, une dans le nom de la colonne dans le php et une dans la base de données mysql. confrim n'est pas un autre mot! Je suis un peu lexdixlick!

Merci pour vos réponses rapides.

+0

Hum ... ce n'était pas juste ça. N'avez-vous pas vu ma réponse http://stackoverflow.com/a/41186319/1415724? J'ai fait quelques modifications depuis mon message original. Ce que vous avez donné comme une réponse ici, ne compte pas vraiment comme une réponse pour les futurs visiteurs, à mon humble avis. –

+0

Je suis aussi (vraiment) dyslexique mais cela ne m'empêche pas de m'assurer à 100% que je ne me trompe pas. –