PHP und MySQL Wählen Sie einen einzelnen Wert aus [duplicate]
Lesezeit: 6 Minuten
Benutzer3055501
Ich würde gerne wissen, wie man einen einzelnen Wert aus meiner MySQL-Tabelle auswählt. Die Tabelle enthält Spalten username und id unter anderem (id ist Autoinkrement und username ist einzigartig). Angesichts des Benutzernamens möchte ich eine Sitzungsvariable festlegen $_SESSION['myid'] gleich dem Wert in der id Spalte, die dem angegebenen Benutzernamen entspricht. Hier ist der Code, den ich bereits ausprobiert habe:
Abfangbarer fataler Fehler: Objekt der Klasse stdClass konnte nicht in String konvertiert werden.
Gießen $value Zeichenfolge einzugeben behebt das Problem nicht.
Nur zur Erinnerung… Die mysql-Erweiterung ist veraltet und wird in Zukunft entfernt: Verwenden Sie stattdessen mysqli oder PDO
– Wes Cossick
2. Januar 2014 um 7:16 Uhr
Dies hat ernsthafte Sicherheitsprobleme. Wie @WesC betont, verwenden Sie nicht die mysql_*-Funktionen. Außerdem sind Sie für SQL-Injection-Angriffe weit offen.
– Elixenid
2. Januar 2014 um 7:17 Uhr
Awlad Liton
Verwenden Sie keine Anführungszeichen in einem Feldnamen oder Tabellennamen innerhalb der Abfrage.
Nach dem Abrufen eines Objekts müssen Sie auf Objektattribute/Eigenschaften (in Ihrem Fall ID) über den Namen der Attribute/Eigenschaften zugreifen.
Eine Note: Bitte verwenden Sie mysqli_* oder PDO, da mysql_* veraltet ist. Hier wird mysqli verwendet:
session_start();
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = new mysqli('localhost', 'username', 'password', 'db_name');
$link->set_charset('utf8mb4'); // always set the charset
$name = $_GET["username"];
$stmt = $link->prepare("SELECT id FROM Users WHERE username=? limit 1");
$stmt->bind_param('s', $name);
$stmt->execute();
$result = $stmt->get_result();
$value = $result->fetch_object();
$_SESSION['myid'] = $value->id;
Bonus-Tipps: Verwenden Sie Limit 1 für diese Art von Szenario, es spart Ausführungszeit 🙂
Dies funktionierte bei der Beseitigung der Fehlermeldung, aber beim Drucken $_SESSION['myid'] auf dem Bildschirm zeigt jetzt “id” anstelle eines bestimmten int.
– Benutzer3055501
2. Januar 2014 um 7:21 Uhr
@ user3055501 : Versuchen Sie den obigen Code. Ich habe die $sql-Zeile geändert und gebe Ihr Feedback. Es sollte funktionieren 🙂
– Awlad Liton
2. Januar 2014 um 7:23 Uhr
… und verwenden Sie niemals reine Benutzereingaben in Ihrer Abfrage.
– mickmackusa
24. Januar 2020 um 9:34 Uhr
Wes Cossick
Die mysql_*-Funktionen sind veraltet und unsicher. Der Code in Ihrer Frage ist anfällig für Injektionsattacken. es ist höchst empfohlen, dass Sie stattdessen die PDO-Erweiterung verwenden, wie folgt:
Danke für die Antwort Wes. Ich werde mich auf jeden Fall mit PDO befassen, wenn ich mehr Zeit habe.
– Benutzer3055501
2. Januar 2014 um 7:31 Uhr
Aus persönlicher Erfahrung empfehle ich Ihnen, sich lieber früher als später damit zu befassen. Je mehr Code Sie mit dem schreiben mysql_* Funktionen, desto mehr werden Sie feststellen, dass Sie komplett neu schreiben müssen. Außerdem ist es in anderen Bereichen eigentlich ziemlich praktisch und besser organisiert.
– Wes Cossick
2. Januar 2014 um 7:33 Uhr
Falls jemand anderes dies sieht und in Panik gerät, können Sie stattdessen zu mysqli wechseln, was besser ist. Beachten Sie das i am Ende von mysql
– Anders M.
15. Oktober 2014 um 1:19 Uhr
Wie @AndersM sagte – ich finde mysqli auch einfacher zu verwenden/lesen als PDO für einfache Abfragen. Beachten Sie jedoch, dass Wes einen sehr wichtigen Punkt anspricht: Wenn ein Teil Ihrer Abfrage Text enthält, der nicht zu 100 % unter Ihrer Kontrolle steht, dann Verwenden Sie eine vorbereitete Anweisung. In mysqli, das heißt prepare, manuelle Diskussion vorbereiteter Statements
– WerkzeugmacherSteve
9. Januar 2017 um 21:05 Uhr
sas
Sie tun dies, indem Sie verwenden mysqli_fetch_field Methode.
Hinweis: Sie können dies tun, indem Sie verwenden mysql_fetch_field() -Methode, aber sie wird in PHP v5.5 veraltet sein
mysqli_fetch_field “Gibt ein Objekt zurück, das Felddefinitionsinformationen enthält, oder FALSE, wenn keine Feldinformationen verfügbar sind.” Das funktioniert also nicht wie in der Antwort vorgeschlagen. -1 deswegen.
– Gusstavv Gil
28. September 2016 um 9:11 Uhr
@GusstavvGil: Ich habe den Code korrigiert, indem ich sichergestellt habe, dass vor dem Aufruf von ein gültiges $result vorhanden ist mysqli_fetch_field. Ich habe auch den fehlenden $link-Parameter hinzugefügt.
Sie können dasselbe mit MySQLi machen, aber es ist komplizierter:
$stmt = $mysqliConn->prepare('SELECT id FROM Users WHERE username=?');
$stmt->bind_param("s", $_GET["username"]);
$stmt->execute();
$data = $stmt->get_result()->fetch_assoc();
$value = $data ? $data['id'] : null;
fetch_assoc() könnte NULL zurückgeben, wenn keine Zeilen von der DB zurückgegeben werden, weshalb ich mit ternary überprüfe, ob Daten zurückgegeben wurden.
Seit PHP 8.1 können Sie auch verwenden fetch_column()
stackoverflow.com/questions/59893254/… (es ist überraschend schwer, sichere Abfragen zu finden, um neue Fragen zu schließen.)
– mickmackusa
24. Januar 2020 um 9:46 Uhr
Alex Siri
Wenn Sie verwenden mysql_fetch_objecterhalten Sie ein Objekt (der Klasse stdClass) mit allen Feldern für die Zeile darin.
Verwenden mysql_fetch_field Anstatt von mysql_fetch_objectdas gibt Ihnen das erste Feld der Ergebnismenge (id in Ihrem Fall). Die Dokumente sind hier
stackoverflow.com/questions/59893254/… (es ist überraschend schwer, sichere Abfragen zu finden, um neue Fragen zu schließen.)
– mickmackusa
24. Januar 2020 um 9:46 Uhr
Satish Sharma
Versuche dies
session_start();
$name = $_GET["username"];
$sql = "SELECT 'id' FROM Users WHERE username="$name" LIMIT 1 ";
$result = mysql_query($sql) or die(mysql_error());
if($row = mysql_fetch_assoc($result))
{
$_SESSION['myid'] = $row['id'];
}
Warnung:mysql_* Die Erweiterung ist ab PHP 5.5.0 veraltet und wurde ab PHP 7.0.0 entfernt. Stattdessen entweder die mysql oder PDO_MySQL Erweiterung verwendet werden soll. Siehe auch die MySQL-API-Übersicht für weitere Hilfe bei der Auswahl einer MySQL-API.
– Dharman ♦
6. April 2020 um 20:08 Uhr
10494000cookie-checkPHP und MySQL Wählen Sie einen einzelnen Wert aus [duplicate]yes
Nur zur Erinnerung… Die mysql-Erweiterung ist veraltet und wird in Zukunft entfernt: Verwenden Sie stattdessen mysqli oder PDO
– Wes Cossick
2. Januar 2014 um 7:16 Uhr
Dies hat ernsthafte Sicherheitsprobleme. Wie @WesC betont, verwenden Sie nicht die mysql_*-Funktionen. Außerdem sind Sie für SQL-Injection-Angriffe weit offen.
– Elixenid
2. Januar 2014 um 7:17 Uhr