結果 - php データベース 取得 表示




配列として準備されたselect文の結果 (5)

後でstr_replace()関数で使用するために、準備済みステートメントの完全な結果を配列(キーと値のペア)として取得したいと思います。

私のテーブルは3つのカラム、インデックスとフィールド "x1"と "x2"を持っています。 私は以下のものをうまく使いました:

$db = new mysqli("servername", "username", "pw", "dbname");

if($ps1 = $db->prepare("SELECT x1, x2 FROM my_table")) {
  $ps1->execute();
  $ps1->bind_result($search, $replace);
    $result = array();
    while ($ps1->fetch()) {
      $result[$search] = $replace;
    }
    $ps1->close();
}

ただし、 whileループを使用せずに、単一行から1つずつ合計していって完全な結果を得るまでの、もっと簡単な方法があるはずです。

私は他の質問を見て、私は以下を思いついた、しかしそれは働かない( "警告:mysqli_fetch_assoc()はパラメータ1がmysqli_resultであることを期待している"):

if($ps1 = $db->prepare("SELECT x1, x2 FROM my_table")) {
  $ps1->execute();
  $result = mysqli_fetch_assoc($ps1);
  return $result;
  $ps1->close();
}

私は$result = mysqli_fetch_all($ps1);も試しました$result = mysqli_fetch_all($ps1); 成功しなかった( "未定義関数mysqli_fetch_all()を呼び出す")。

ところで、私はPHP 5.6を使用しています。

MYSQLNDに関するコメントでのいくつかの回答と議論の後の追加:

phpinfo()は、 mysqlndセクションに次の情報を表示します。

ロードされたプラグイン:mysqlnd、debug_trace、auth_plugin_mysql_native_password、auth_plugin_mysql_clear_password、auth_plugin_sha256_password


あなたはこのようなことを試しましたか?

$db = new mysqli("servername", "username", "pw", "dbname");

if($ps1 = $db->prepare("SELECT x1, x2 FROM my_table")) {
  $ps1->execute();
  $result = $ps1->fetchAll(PDO::FETCH_NAMED);
  $ps1->close();
}

更新

私はこういう意味です( mysqlndドライバをインストールした場合)

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 150,5";

if ($stmt = mysqli_prepare($link, $query)) {

    /* execute statement */
    mysqli_stmt_execute($stmt);

    /* get result object */
    $result = mysqli_fetch_all(mysqli_stmt_get_result($stmt));

    /* close statement */
    mysqli_stmt_close($stmt);
}

/* close connection */
mysqli_close($link);
?>

このような関数でmysqli_resultクラスを拡張しようとするかもしれません:

public function my_fetch_keyval() {
    for ($result = array(); $tmp = $this->fetch_row();) {
        // Expecting 2 columns. 1st = Key; 2nd = Value
        $result[$tmp[0]] = $tmp[1];
    }
    return $result;
}

それからあなたはあなたのコードでそれを使うことができます:

if($ps1 = $db->prepare("SELECT x1, x2 FROM my_table")) {
    $ps1->execute();
    $my_assoc_array = $ps1->my_fetch_keyval();
    $ps1->close();
}

もっと簡単な方法があります。 array_column使用を検討してください。

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$query = "SELECT x1, x2 FROM my_table";

if ($stmt = mysqli_prepare($link, $query)) {

    /* execute statement */
    mysqli_stmt_execute($stmt);

    /* get result object */
    $rows = mysqli_fetch_all(mysqli_stmt_get_result($stmt), MYSQLI_ASSOC);

    /* get formatted object */
    $result = array_column($rows, 'x2', 'x1');

    /* close statement */
    mysqli_stmt_close($stmt);
}

/* close connection */
mysqli_close($link);

編集:手続き型mysqli関数を使用するための更新された回答


前の答え(適切なmysqlnd extのmysqlnd - mysqli用とPDO用の2つがあります)から、2つの選択肢があると結論できます。準備済みステートメントをwhileループまたはa。標準クエリですが、結果は連想配列として返されます。

あなたはパラメータを持っていないので、あなたは安全に普通のoleクエリを使うことができます。

a)エスケープする必要があるユーザー入力がない、ステートメントにパラメーターがない、したがってセキュリティー上のリスクがない

b)プリペアドステートメントのパフォーマンス向上は、プレーンSQLクエリとして使用しているため、あるとしても怠慢です。 同じステートメントを何度も何度も何度も繰り返し使用すると、それにバインドされているパラメーター値のみが変更されたときに、準備済みステートメントが輝くようになります。

それでは、追跡しましょう。

$conn = mysqli($host, $user, $pass, $dbname);

$query = $conn->query("SELECT x1, x2 FROM your_table");

$result = $query->fetch_assoc();

結果は以下の形式になります。

[
   'x1' => 'v1',
   'x2' => 'v2'
]

1つのアイテムだけではなくデータセット全体が必要な場合は、次のようにします。

$result = $query->fetch_all(MYSQLI_ASSOC);

結果は次のようになります。

[
    [
      'x1' => 'v1',
      'x2' => 'v2'
   ],
   [
     'x1' => 'v1',
     'x2' => 'v2'
   ],
   ...
]

更新

mysqli::fetch_allがあなたにもエラーを投げるようになったので、ループなしでデータセット全体を取得する方法はないと思います。 あなたがあなたのアプローチに代わるものが欲しいならば、おそらくこのような何か:

$query = $conn->query("SELECT x1, x2 FROM your_table");

$results = [];
for ($i = 0; $i < $query->num_rows; $i++) {
    $row = $query->fetch_assoc();
    $results[$row['x1']] = $row['x2'];
}

またはこれ:

while($row = $query->fetch_assoc()) {
   $results[$row['x1']] = $row['x2'];  
}

しかし、正直に言うと、最初のやり方でうまくいくかもしれません。もしmysqli::fetch_all利用できなければ、それが最善の方法です。


英語をすみません

mysqli->prepare->executemysqli_stmtオブジェクトを返すのに対して、 mysqli_fetch_assoc()が引数としてmysqli_resultを取るので、私はそれが可能ではないと思います。

あなたができることはJesusTheHun's答えの手続き的な方法を使うことであるか、あるいはprepare and execute代わりに$ps1 = $db->query($stmt)使ってそれを$ps1->fetch_all(MYSQLI_ASSOC)渡すことができる

例:

if($ps1 = $db->query("SELECT x1, x2 FROM my_table")) {
  $result = $ps1->fetch_all(MYSQLI_ASSOC);

  $ps1->close();
  return $result;
}

print_r($result);

mysqli用のPHPドキュメント





prepared-statement