39

mySQLiを初めて使用しようとしています。私はループの場合にそれをしました。ループの結果は表示されていますが、単一のレコードを表示しようとするとスタックします。これが機能しているループコードです。

<?php
// Connect To DB
$hostname="localhost";
$database="mydbname";
$username="root";
$password="";

$conn = mysqli_connect($hostname, $username, $password, $database);
?>

<?php
$query = "SELECT ssfullname, ssemail FROM userss ORDER BY ssid";
$result = mysqli_query($conn, $query);
$num_results = mysqli_num_rows($result);
?>

<?php
/*Loop through each row and display records */
for($i=0; $i<$num_results; $i++) {
$row = mysqli_fetch_assoc($result);
?>

Name: <?php print $row['ssfullname']; ?>
<br />
Email: <?php print $row['ssemail']; ?>
<br /><br />

<?php 
// end loop
} 
?>

最初の行から単一のレコード、任意のレコード、名前、または電子メールを表示するにはどうすればよいですか?単一のレコードだけを表示するにはどうすればよいですか?単一レコードの場合、上記のループ部分がすべて削除されていると考えて、ループのない単一レコードを表示してみましょう。

4

6 に答える 6

72

必要な結果が 1 つだけの場合は、ループを使用しないでください。すぐに行をフェッチするだけです。

  • 行全体を連想配列にフェッチする必要がある場合:

      $row = $result->fetch_assoc();
    
  • 単一の値のみが必要な場合

      $row = $result->fetch_row();
      $value = $row[0] ?? false;
    

最後の例は、最初に返された行から最初の列を返すfalseか、行が返されなかった場合に返します。1行に短縮することもできますが、

$value = $result->fetch_row()[0] ?? false;

以下は、さまざまなユースケースの完全な例です

クエリで使用する変数

クエリで変数を使用する場合は、準備済みステートメントを使用する必要があります。たとえば、変数があるとします$id

$query = "SELECT ssfullname, ssemail FROM userss WHERE id=?";
$stmt = $conn->prepare($query);
$stmt->bind_param("s", $id);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();

// in case you need just a single value
$query = "SELECT count(*) FROM userss WHERE id=?";
$stmt = $conn->prepare($query);
$stmt->bind_param("s", $id);
$stmt->execute();
$result = $stmt->get_result();
$value = $result->fetch_row()[0] ?? false;

上記のプロセスの詳細な説明は、私の記事にあります。なぜ従わなければならないかについては、この有名な質問で説明されています

クエリに変数がありません

クエリで変数を使用しない場合、次のquery()メソッドを使用できます。

$query = "SELECT ssfullname, ssemail FROM userss ORDER BY ssid";
$result = $conn->query($query);
// in case you need an array
$row = $result->fetch_assoc();
// OR in case you need just a single value
$value = $result->fetch_row()[0] ?? false;

ところで、学習中に未加工の API を使用することは問題ありませんが、将来的にはデータベース抽象化ライブラリまたは少なくともヘルパー関数を使用することを検討してください。

// using a helper function
$sql = "SELECT email FROM users WHERE id=?";
$value = prepared_select($conn, $sql, [$id])->fetch_row[0] ?? false;

// using a database helper class
$email = $db->getCol("SELECT email FROM users WHERE id=?", [$id]);

おわかりのように、ヘルパー関数はコードの量を減らすことができますが、クラスのメソッドはすべての繰り返しコードを内部にカプセル化できるため、意味のある部分 (クエリ、入力パラメーター、目的の結果形式 (メソッド名の形式)。

于 2013-01-31T11:53:52.330 に答える
8

を使用し mysqli_fetch_row()ます。これを試して、

$query = "SELECT ssfullname, ssemail FROM userss WHERE user_id = ".$user_id;
$result = mysqli_query($conn, $query);
$row   = mysqli_fetch_row($result);

$ssfullname = $row['ssfullname'];
$ssemail    = $row['ssemail'];
于 2013-01-31T11:32:00.070 に答える
7

特定のユーザーIDを使用してEdwinが提案したように、結果を1つだけ想定すると、これを行うことができます。

$someUserId = 'abc123';

$stmt = $mysqli->prepare("SELECT ssfullname, ssemail FROM userss WHERE user_id = ?");
$stmt->bind_param('s', $someUserId);

$stmt->execute();

$stmt->bind_result($ssfullname, $ssemail);
$stmt->store_result();
$stmt->fetch();

ChromePhp::log($ssfullname, $ssemail); //log result in chrome if ChromePhp is used.

または、1 人のユーザーのみを選択する「あなたの常識」として。

$stmt = $mysqli->prepare("SELECT ssfullname, ssemail FROM userss ORDER BY ssid LIMIT 1");

$stmt->execute();
$stmt->bind_result($ssfullname, $ssemail);
$stmt->store_result();
$stmt->fetch();

PHP v.5を除いて、上記と実際に異なる点はありません。

于 2015-04-29T16:01:45.657 に答える