2012-03-28 22 views
2

Wenn ich meinen ersten Benutzer in der Tabelle 'Benutzer' registriere, hat die ID den gleichen Wert wie Benutzer_ID in der Verknüpfungstabelle, 1, (Sprache). Allerdings, wenn ich einen anderen Benutzer (ID2 Benutzer) die user_id in Sprache zu registrieren ist noch 1. Siehe SQL:Fremdschlüssel wird nicht korrekt verknüpft

CREATE TABLE `language` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`user_id` int(11) NOT NULL, 
`native` varchar(30) NOT NULL, 
`other` varchar(30) NOT NULL, 
`other_list` varchar(9) NOT NULL, 
`other_read` varchar(9) NOT NULL, 
`other_spokint` varchar(9) NOT NULL, 
`other_spokprod` varchar(9) NOT NULL, 
`other_writ` varchar(9) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `user_id` (`user_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ; 


CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `md5_id` varchar(200) NOT NULL, 
    `full_name` tinytext CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL, 
    `user_name` varchar(10) NOT NULL, 
    `user_email` varchar(30) NOT NULL, 
    `user_level` tinyint(4) NOT NULL DEFAULT '1', 
    `pwd` varchar(220) NOT NULL, 
    `nationality` varchar(30) NOT NULL, 
    `department` varchar(20) NOT NULL, 
    `birthday` date NOT NULL, 
    `date` date NOT NULL DEFAULT '0000-00-00', 
    `users_ip` varchar(200) NOT NULL, 
    `activation_code` int(10) NOT NULL DEFAULT '0', 
    `banned` int(1) NOT NULL, 
    `ckey` varchar(200) NOT NULL, 
    `ctime` varchar(220) NOT NULL, 
    `approved` int(1) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; 

Das ist mein PHP-Code:

if(empty($_SESSION['$user_id'])) { // user not logged in; redirect to somewhere else } 
if (!empty($_POST['doLanguage']) && $_POST['doLanguage'] == 'Submit') 
{ 
$result = mysql_query("SELECT `id` FROM users WHERE `banned` = '0'") or 
die (mysql_error()); 


list($id) = mysql_fetch_row($result); 

session_start(); 
$_SESSION['user_id']= $id; 

sql_insert = "INSERT into `language` 
(`user_id`,`native`,`other`,`other_list`,`other_read`, `other_spokint` 
,`other_spokprod`,`other_writ` ) 
VALUES 
('$id','$native','$other','$other_list','$other_read','$other_spokint', 
'$other_spokprod','$other_writ') "; 

mysql_query($sql_insert,$link) or die("Insertion Failed:" . mysql_error());  
} 

header("Location: myaccount.php?id=' . $_SESSION[user_id] .'"); 
exit(); 

Würde jede Hilfe dankbar!

+3

Wo ist $ ID angegeben? Oder wird diese Zeile rückwärts geschrieben: "$ _SESSION ['user_id'] = $ id;" – Yamikuronue

+0

@Yamikuronue - es kommt aus dem 'list' Konstrukt, das mit dem abgerufenen Resultset arbeitet. –

+0

@Yamikuronue Ich habe versucht, es auf die andere Weise zu schreiben, aber immer noch das Problem von user_id 1, wenn es sein sollte 2.thanks – user1296762

Antwort

1

Ich denke, das liegt daran, dass Ihre erste Auswahlabfrage wird alle Benutzer die Auswahl, die nicht

verboten

Also die Abfrage ändern müssen durch den neuen Benutzer zu filtern:

"SELECT `id` FROM users WHERE `banned` = '0' and id=" . $_SESSION['$user_id']; 

Der Grund, warum die user_id Feld wurde immer mit 1 gefüllt, weil mysql_fetch_row den ersten Datensatz mit der Benutzer-ID 1 erhielt.

Wenn Sie also den neuen Benutzer filtern, sollte mysql_fetch_row die ID des neuen Benutzers erhalten.

EDIT

Ich bin nur auf den Code wieder, und es sieht aus wie Sie die Benutzer-ID in PHP nicht speichern, nachdem Sie es einfügen, so dass Ihr user_id für $ _SESSION null ist.

Also mein oben genanntes Beispiel wird nicht funktionieren. Verwenden Sie die folgende Funktion anstelle der obigen Abfrage, um die ID Ihres neu erstellten Benutzers abzurufen. Sie rufen diese Funktion auf, nachdem Sie Ihre Einfügeabfrage ausgeführt haben. Diese Funktion wird das neue von Ihrem neu erstellten Benutzer erhalten.

mysql_insert_id()

http://php.net/manual/en/function.mysql-insert-id.php

EDIT 2

Ok, da mysql_insert_id() hat nicht für Sie arbeiten, vielleicht können Sie die folgende versuchen. Ich habe gerade Ihre Select-Abfrage geändert, um nach id desc zu sortieren.

Nur eine Anmerkung, das ist wahrscheinlich nicht die beste Lösung. Aber auf einer wenig frequentierten Website sollte es in Ordnung sein. Um die Abfrage etwas genauer zu gestalten, sollten Sie nach der Benutzer-ID suchen, die auf einem eindeutigen Feld wie einem Nutzernamen oder einer E-Mail basiert. Dies würde sicherstellen, dass Sie die richtige ID zurückbekommen.

EDIT 3 Hier ist ein Beispiel für die Überprüfung der E-Mail des Benutzers. Dies ist nur die MySQL-Abfrage, Sie müssen dies für PHP anpassen. Tut mir leid, ich bin gerade in der Klasse.

"SELECT `id` FROM users WHERE `banned` = '0' and email='[email protected]' limit 1 
+0

Kein Glück mit dem Hinzufügen von mysql_insert_id(). Immer noch user_id 1 :(Ich habe es nach - mysql_query ($ sql_insert, $ link) oder sterben ("Einfügen fehlgeschlagen:". Mysql_error());) – user1296762

+0

Haben Sie etwas wie '$ userId = mysql_insert_id()'? – Gohn67

+0

ja $ id = mysql_insert_id() versucht, und $ user_id = mysql_insert_id();. – user1296762

Verwandte Themen