web-dev-qa-db-ja.com

PHPおよびMySQLは単一の値を選択します

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型にキャストしても問題は解決しません。

20
user3055501

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を使用してください。

53
Awlad Liton

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

これを行うには、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では非推奨になります

9
sas

mysql_fetch_objectを使用すると、その中の行のすべてのフィールドを持つ(クラスstdClassの)オブジェクトを取得します。

mysql_fetch_fieldの代わりにmysql_fetch_objectを使用すると、結果セットの最初のフィールドが得られます(この場合はid)。ドキュメントは here です

2
Alex Siri

これを試して

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

idは一意であるため、単一のusernameに対応する単一のusernameのみが存在することは明らかです。

しかし、実際の問題はクエリ自体にあります。

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

O/P

+----+
| 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;
1
Rajesh Paul

mysql_*拡張機能は2013年に廃止され、2018年にPHPから完全に削除されました。2つの選択肢 PDO または MySQLi があります。

PDO

より単純なオプションは、きちんとしたヘルパー関数を持つPDOです fetchColumn()

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

適切なPDOチュートリアル

MySQLi

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;
0
Dharman

これを試して

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