2

数年前、SOユーザーは、グループ内で「パートナー」を割り当てるための次のコードを作成するのを手伝ってくれました(ラウンドロビン[A-> B-> C-> D-> A-> B-> ...]など)。 )::

$q = "SELECT user_id FROM users WHERE group_id='$gi' ORDER BY RAND()";
$r = mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($dbc));

    while ($row = mysqli_fetch_array($r)) {
        $users[] = $row[0];
    }

    $current = end($users);
    $partners = array();
    foreach ($users as $user) {
        $partners[$user] = $current;
        $current = $user;
        $q="UPDATE users SET partner='{$partners[$user]}' WHERE user_id='{$user}'";
        mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($dbc));
    }

しかし今、私はコードの多くをPDOで書き直しており、配列が私を殺しています。これは、これを書き直すためのこれまでの私の最善の試みです。

$query = "SELECT id FROM users WHERE gid=:gid ORDER BY RAND()";
$query_params = array( ':gid' => $_SESSION['user']['gid'] );
try {
    $stmt = $db->prepare($query);
    $result = $stmt->execute($query_params);
} 
catch(PDOException $ex) {   
    die("Failed to run query: " . $ex->getMessage());
}
while ($row = $stmt->fetchAll(PDO::FETCH_COLUMN)) {
$users[] = $row[0];
}
$current = end($users);
$partners = array();
foreach ($users as $user) {
    $partners[$user] = $current;
    $current = $user;
    $query = "UPDATE users SET partner=:partner WHERE id=:id";
    $query_params = array(
        ':partner' => '{$partners[$user]}',
        ':id' => '{$user}'
    );

    try {
    $stmt = $db->prepare($query);
    $result = $stmt->execute($query_params);
    }
    catch(PDOException $ex) {
        die("Failed to run query: " . $ex->getMessage());
    }
}

私が読んだり検索したりしても、改訂されたコードが機能しなくなった理由についての答えは得られませんでした。 現在行われているのは、パートナーのラウンドロビン割り当てではなく、1人のユーザーが自分自身をパートナーとして割り当てられることだけです。

私が知る限り、私のfetchAll発言は正しくありませんが、どうすればよいでしょうか。私の人生のために、私はそれを理解することはできません。

(そして、あなたがこのすべてを行うためのより効率的な方法を提案しても、私は動揺しません。)

4

2 に答える 2

1
   ':id' => '{$user}'

間違っている。{リテラル、、、などをクエリ$に挿入しようとしていuます。それはただあるべきです

  ':id' => $user

パートナーも同様です。

覚えておいてください...PHPは、一重引用符で囲まれた文字列の変数を補間しません。

于 2013-02-22T21:12:19.173 に答える
1

さらに1時間精練していじくり回して、私は答えに出くわしました。なぜどこにも共有されていないように見えるのかわかりませんが、PDOに相当するものmysqli_fetch_arrayは普遍的ではありませんfetchAll。この場合、および他の多くの場合、適切な代替はfetch(PDO::FETCH_NUM)です。

したがって、私のコードは、この1つの変更を除いて、上記とまったく同じように機能します。

while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
    $users[] = $row[0];
}

それ以外の:

while ($row = $stmt->fetchAll(PDO::FETCH_COLUMN)) {
    $users[] = $row[0];
}
于 2013-02-22T21:35:31.687 に答える