2016-12-16 2 views
-3

Ich bin neu in PHP, aber normalerweise in der Lage, die meisten Probleme zu lösen, aber dieses hat mich.INSERT INTO funktioniert nicht für die 2. Tabelle

Ich versuche, eine Newsletter-Anmeldung (einzelnes Feld) mit einem einzigen Absenden-Button zu erstellen. Ich habe das funktioniert gut, Senden einer E-Mail und Einfügen der Formulardaten in meine Tabelle. Ich möchte jedoch Funktionalität hinzufügen, um eine Bestätigungs-E-Mail an die Person senden zu lassen, die sich anmeldet. Ich habe umfangreiche Nachforschungen angestellt und kenne die Methode dahinter, aber mein Code erfasst gerade keine Daten in meine zweite Tabelle, in der die Bestätigungsinformationen gespeichert sind.

Ich habe 2 Tabellen: Tabelle 1 mit dem Namen 'Newsletter' Spalten sind:

idmail,emailaddress,datetime,state 

idmail-AUTO_INCREMENT

Tabelle 2 genannt 'bestätigen' gesetzt Spalten sind:

idconfirm,emailaddress,confirmkey 

Hier ist mein Code (Ich habe den E-Mail-Teil weggelassen, der danach geht, da das alles OK funktioniert):

//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); 

Wenn ich eine E-Mail-Adresse einreiche, wird die erste Tabelle korrekt ausgefüllt.

Ziel ist es, die in der ersten INSERT INTO-Abfrage erstellte Auto-ID in eine Variable zu übernehmen und sie dann in der zweiten Tabellenspalte namens 'idconfim' hinzuzufügen.

Ich habe versucht:

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

und alle Variablen die richtigen Informationen halten.

Hat jemand irgendwelche Ideen? Ich habe versucht, viele Dinge hier aufzulisten, aber ich habe das recherchiert und ich weiß nur nicht, wo ich falsch liege.

Vielen Dank im Voraus.

+1

Zunächst einmal: 'INSERT INTO confrim' ->' INSERT INTO confirm' – lubilis

+0

Führen Sie die Abfrage direkt auf phpmyadmin und sehen Sie die Nachricht. –

+1

Ihr Skript ist in Gefahr von [SQL Injection Attack] (http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) Werfen Sie einen Blick auf, was passiert ist [ Little Bobby Tables] (http://bobby-tables.com/) Auch [Wenn Sie Eingaben entgehen, ist es nicht sicher!] (Http://stackoverflow.com/questions/5741187/sql-injection-that-gets -around-mysql-real-escape-string) Verwenden Sie [vorbereitete parametrisierte Anweisungen] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) – RiggsFolly

Antwort

2

Eines der Probleme ist, dass Sie den MySQL-Fehler nicht anzeigen, wenn es einen gibt. So müssen Sie entweder die Serverprotokolle für den Fehler in PHP überprüfen, können Sie zwingen, den Fehler in das Fehlerprotokoll ausdrucken oder etwas anderes tun:

zum Beispiel:

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

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

Neben PHP sollte Zurücksenden eines HTTP-Fehlers an den Client. Sie sollten diesen Fehler abfangen.

Sobald Sie den SQL-Fehler sehen, wird es leicht herauszufinden, was Sie falsch gemacht haben.

EDIT Fred ii fing den wirklichen Fehler, aber ich denke, der Fehler beim ersten Mal geworfen worden wäre, der Fehler gemacht wird:

mysqli_query($dbc, $query1); 

$query1 kein String. Und wenn Sie bemerkt haben, haben Sie bereits die Abfrage in der Zeile oben ausgeführt. Das Lesen der PHP-Fehlerprotokolle zeigt Ihnen genau, wo der Fehler liegt.

+2

"Ich denke" ist keine große Antwort (ich denke, ist mehr ein Kommentar). Schau dir ihren Code noch einmal an. Ich skizzierte, was falsch ist, aber ich gab keine Antwort, weil ich ein mögliches Kaninchenloch befürchtete. –

+0

Das ist ein guter Punkt, jedenfalls hätte das Lesen der Fehlerprotokolle den Programmierer zu dem Problem geführt, auf das Sie gerade hingewiesen haben. –

+0

Sie sind jedoch technisch korrekt, wenn Sie 'mysqli_error()' verwenden, was einen Fehler verursacht hätte. –

5

Ich poste meinen Kommentar als Antwort hier:

Das Problem hier ist die $query2 = mysqli_query($dbc,... '$hash')"); mysqli_query($dbc, $query2); und einen Fehler darüber bekommen haben soll. Dies ist neben dem möglichen Tippfehler für den Tabellennamen confrim.

Sie müssen mysqli_query($dbc, $query2); hier entfernen und ersetzen Sie es mit:

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

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

(Another edit): Sie den gleichen Fehler haben sich hier:

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

und muss geändert werden:

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

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

Wie in den Kommentaren von RiggsFolly angegeben; Verwenden Sie nicht MD5, um Passwörter zu hashen, es ist nicht mehr sicher. In mehr als 30 Jahren sind viele Wasserläufe unter der Brücke.

Verwenden Sie password_hash()http://php.net/manual/en/function.password-hash.php und eine vorbereitete Anweisung.

Edit: Es sieht für mich jetzt, dass nach dem Blick auf Ihren Code erneut, dass Sie nicht versuchen, ein Passwort zu speichern, sondern mehr als ein Bestätigungsschlüssel. Wenn dies der Fall ist, können Sie das Kennwort ignorieren. Wenn Sie sich jedoch dafür entscheiden, künftig Kennwörter mit MD5 zu speichern, geben Sie nicht ein.

+1

Tippfehler bestätigen. Was für ein Auge. (Y) –

+1

@NanaPartykar Typo für die Tabelle "vielleicht" ;-) aber die Verwendung von 2x mysqli_query() ist in der Tat ein anderes Problem und ein großes Problem. –

+0

Denke, du hast Recht, dass der Passwort-Hash kein Passwort ist. Knie-Ruck-Reaktion .... mit der Betonung auf _jerk_ natürlich – RiggsFolly

-3

Entschuldigung für die Zeitverschwendung.

Danke an jeffery_the_wind für das Zeigen auf die Protokolle. Ich werde sie in Zukunft verwenden.

Das Problem war zwei Rechtschreibfehler, eine im Spaltennamen in der PHP-und eine in der MySQL-Datenbank. confrim ist kein Wort! Ich bin leicht lexdixlick!

Vielen Dank für Ihre schnelle Antworten.

+0

Ähm .... es war nicht nur das. Hast du meine Antwort nicht http://stackoverflow.com/a/41186319/1415724 gesehen? Seit meinem ursprünglichen Post habe ich einige Änderungen daran vorgenommen. Was Sie hier als Antwort gegeben haben, ist nicht wirklich eine Antwort für zukünftige Besucher, IMHO. –

+0

Ich bin auch (wirklich) legasthenisch, aber das hindert mich nicht daran, 100% sicher zu machen, dass ich keinen Fehler mache. –