MySQLテーブルから単一の値を選択する方法を知りたい。この表には、列username
およびid
が含まれます(id
は自動インクリメントで、username
は一意です)。ユーザー名を指定して、セッション変数$_SESSION['myid']
を、指定されたユーザー名に対応するid
列の値に等しく設定します。私がすでに試したコードは次のとおりです。
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;
これまでのところ、私は得ています:
キャッチ可能な致命的エラー:クラスstdClassのオブジェクトを文字列に変換できませんでした。
$value
をstring型にキャストしても問題は解決しません。
1)クエリ内のフィールド名またはテーブル名に引用符を使用しないでください。
2)オブジェクトを取得した後、属性/プロパティ名でオブジェクトの属性/プロパティ(ケースid)にアクセスする必要があります。
動作するはずです
ボーナスのヒント:このタイプのシナリオでは制限1を使用すると、実行時間を節約できます:)
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;
注:mysql_ *は廃止されているため、mysqli_ *またはPDOを使用してください。
Mysql_ *関数は非推奨であり、安全ではありません。 あなたの質問のコードは、 インジェクション攻撃に対して脆弱です 。それはhighly次のように、代わりにPDO拡張機能を使用することをお勧めします。
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
はPDOオブジェクト変数です。 PHPおよびPDOの詳細については、 https://www.php.net/pdo_mysql を参照してください。
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
}
これを行うには、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;
}
注:mysql_fetch_field()
メソッドを使用しても同様に実行できますが、php v5.5では非推奨になります
mysql_fetch_object
を使用すると、その中の行のすべてのフィールドを持つ(クラスstdClassの)オブジェクトを取得します。
mysql_fetch_field
の代わりにmysql_fetch_object
を使用すると、結果セットの最初のフィールドが得られます(この場合はid
)。ドキュメントは here です
これを試して
$value = mysql_result($result, 0);
id
は一意であるため、単一のusername
に対応する単一のusername
のみが存在することは明らかです。
しかし、実際の問題はクエリ自体にあります。
$sql = "SELECT 'id' FROM Users WHERE username='$name'";
+----+
| id |
+----+
| id |
+----+
つまり、'id'
は実際にはid
属性としてではなく文字列として扱われます。
$sql = "SELECT `id` FROM Users WHERE username='$name'";
つまり、一重引用符( ')の代わりにグレーブアクセント( `)を使用します。
または
$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;
mysql_*
拡張機能は2013年に廃止され、2018年にPHPから完全に削除されました。2つの選択肢 PDO または MySQLi があります。
より単純なオプションは、きちんとしたヘルパー関数を持つPDOです fetchColumn()
:
$stmt = $pdo->prepare("SELECT id FROM Users WHERE username=?");
$stmt->execute([ $_GET["username"] ]);
$value = $stmt->fetchColumn();
MySQLiでも同じことができますが、より複雑です。
$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;
これを試して
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'];
}