web-dev-qa-db-fra.com

PHP et MySQL sélectionnent une valeur unique

J'aimerais savoir comment sélectionner une seule valeur dans ma table MySQL. Le tableau comprend les colonnes username et id entre autres (id est auto-incrémenté et username est unique). Étant donné le nom d'utilisateur, je veux définir une variable de session $_SESSION['myid'] égal à la valeur dans la colonne id qui correspond au nom d'utilisateur donné. Voici le code que j'ai déjà essayé:

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;

Jusqu'ici je reçois:

Erreur fatale capturable: l'objet de la classe stdClass n'a pas pu être converti en chaîne.

Casting $value taper une chaîne ne résout pas le problème.

20
user3055501

1) N'utilisez pas de citation dans un nom de champ ou de table dans la requête.

2) Après avoir récupéré un objet, vous devez accéder aux attributs/propriétés de l'objet (dans votre identifiant de cas) par nom d'attribut/propriété.

ça devrait marcher
Astuces bonus: utilisez la limite 1 pour ce type de scénario, cela vous fera gagner du temps d'exécution:)

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

Une remarque: veuillez utiliser mysqli_ * ou PDO car mysql_ * est obsolète.

53
Awlad Liton

Les fonctions mysql_ * sont obsolètes et dangereuses. Le code de votre question est vulnérable à attaques par injection . Il est fortement recommandé que vous utilisez plutôt l'extension PDO, comme ceci:

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'];

$PDO est votre variable d'objet PDO. Voir https://www.php.net/pdo_mysql pour plus d'informations sur PHP et PDO.

Pour une aide supplémentaire:

Voici un moyen rapide de vous connecter à votre base de données à l'aide de PDO:

$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
}
11
Wes Cossick

Vous faites cela en utilisant la méthode mysqli_fetch_field.

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;
}

Remarque: vous pouvez le faire en utilisant également la méthode mysql_fetch_field(), mais celle-ci sera obsolète dans php v5.5

9
sas

Quand vous utilisez mysql_fetch_object, vous obtenez un objet (de classe stdClass) avec tous les champs de la ligne qu’il contient.

Utilisation mysql_fetch_field au lieu de mysql_fetch_object, cela vous donnera le premier champ du jeu de résultats (id dans votre cas). Les docs sont ici

2
Alex Siri

Essaye ça

$value = mysql_result($result, 0);
2
Khawer Zeshan

Il est bien évident qu'il n'y a qu'un seul id correspondant à un seul username parce que username est unique.

Mais le problème réside dans la requête elle-même.

$sql = "SELECT 'id' FROM Users WHERE username='$name'";

O/P

+----+
| id |
+----+
| id |
+----+

i.e. 'id' est en fait traité comme une chaîne et non comme un attribut id.

Synatx correct:

$sql = "SELECT `id` FROM Users WHERE username='$name'";

c'est-à-dire utilisez accent grave (`) au lieu de guillemet simple (').

o

$sql = "SELECT id FROM Users WHERE username='$name'";

Code complet

session_start();
$name = $_GET["username"];
$sql = "SELECT `id` FROM Users WHERE username='$name'";
$result = mysql_query($sql);
$row=mysql_fetch_array($result)
$value = $row[0];
$_SESSION['myid'] = $value;
1
Rajesh Paul

L'extension mysql_* Est obsolète en 2013 et complètement supprimée de PHP en 2018. Vous avez deux alternatives PDO = ou MySQLi .

AOP

L'option la plus simple est PDO, qui a une fonction d'assistance soignée fetchColumn() :

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

Didacticiel PDO approprié

MySQLi

Vous pouvez faire la même chose avec MySQLi, mais c'est plus compliqué:

$sql = "SELECT id FROM Users WHERE username=?";
$stmt = $mysqliConn->prepare($sql);
$stmt->bind_param("s", $_GET["username"]);
$stmt->execute();
$data = $stmt->get_result()->fetch_row();
$value = $data['id'] ?? null;
0
Dharman

essaye ça

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'];
}
0
Satish Sharma