PHP und MySQL Wählen Sie einen einzelnen Wert aus [duplicate]

Lesezeit: 6 Minuten

Benutzer-Avatar
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:

session_start();
$name = $_GET["username"];
$sql = "SELECT 'id' FROM Users WHERE username="$name"";
$result = mysql_query($sql);
$value = mysql_fetch_object($result);
$_SESSION['myid'] = $value;

Bisher bekomme ich:

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

Benutzer-Avatar
Awlad Liton

  1. Verwenden Sie keine Anführungszeichen in einem Feldnamen oder Tabellennamen innerhalb der Abfrage.

  2. 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

Benutzer-Avatar
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:

session_start();

$query = "SELECT 'id' FROM Users WHERE username = :name LIMIT 1";
$statement = $PDO->prepare($query);
$params = array(
    'name' => $_GET["username"]
);
$statement->execute($params);
$user_data = $statement->fetch();

$_SESSION['myid'] = $user_data['id'];

Wo $PDO ist Ihre PDO-Objektvariable. Sehen https://www.php.net/pdo_mysql für weitere Informationen über PHP und PDO.

Für zusätzliche Hilfe:

Hier ist eine Starthilfe, wie Sie mit PDO eine Verbindung zu Ihrer Datenbank herstellen:

$database_username = "YOUR_USERNAME";
$database_password = "YOUR_PASSWORD";
$database_info = "mysql:host=localhost;dbname=YOUR_DATABASE_NAME";
try
{
    $PDO = new PDO($database_info, $database_username, $database_password);
}
catch(PDOException $e)
{
    // Handle error here
}

  • 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

Benutzer-Avatar
sas

Sie tun dies, indem Sie verwenden mysqli_fetch_field Methode.

session_start();
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
$name = $_GET["username"];
$sql = "SELECT 'id' FROM Users WHERE username="$name" limit 1";
$result = mysqli_query($link, $sql);
if ($result !== false) {
    $value = mysqli_fetch_field($result);
    $_SESSION['myid'] = $value;
}

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.

    – WerkzeugmacherSteve

    9. Januar 2017 um 20:51 Uhr

  • @ToolmakerSteve mysqli_fetch_field gibt den Wert nicht zurück. Es gibt die Felddefinition zurück, wie Name, Tabelle, Flags. -1 deswegen… php.net/manual/en/mysqli-result.fetch-field.php

    – Gemeiner Hecht

    14. September 2017 um 11:39 Uhr


  • Diese Antwort sollte nicht verwendet werden, da sie unsicher/instabil ist.

    – mickmackusa

    24. Januar 2020 um 9:35 Uhr

  • Warnung: Diese Antwort ist völlig falsch. mysqli_fetch_field() gibt Metadaten zu einer Tabellenspalte zurück, nicht den Wert selbst.

    – Dharman

    6. April 2020 um 20:12 Uhr

Versuche dies

$value = mysql_result($result, 0);

Benutzer-Avatar
Dharman

mysql_* Die Erweiterung wurde 2013 als veraltet markiert und 2018 vollständig aus PHP entfernt. Sie haben zwei Alternativen PDO oder MySQLi.

PDO

Die einfachere Option ist PDO, das eine nette Hilfsfunktion hat fetchColumn():

$stmt = $pdo->prepare("SELECT id FROM Users WHERE username=?");
$stmt->execute([ $_GET["username"] ]);
$value = $stmt->fetchColumn();

Richtiges PDO-Tutorial

MySQLi

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()

$stmt->execute();
$value = $stmt->get_result()->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


Benutzer-Avatar
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


Benutzer-Avatar
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

1049400cookie-checkPHP und MySQL Wählen Sie einen einzelnen Wert aus [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy