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.
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.
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'];
Où $PDO
est votre variable d'objet PDO. Voir https://www.php.net/pdo_mysql pour plus d'informations sur PHP et PDO.
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
}
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
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
Essaye ça
$value = mysql_result($result, 0);
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'";
+----+
| id |
+----+
| id |
+----+
i.e. 'id'
est en fait traité comme une chaîne et non comme un attribut id
.
$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'";
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;
L'extension mysql_*
Est obsolète en 2013 et complètement supprimée de PHP en 2018. Vous avez deux alternatives PDO = ou MySQLi .
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();
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;
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'];
}