【发布时间】:2013-02-08 14:05:00
【问题描述】:
几年前,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());
}
}
我所有的阅读和搜索都没有找到为什么我的修改后的代码不再有效的答案。 现在所发生的只是将一个用户自己分配为合作伙伴,而不是循环分配合作伙伴。
据我所知,我的fetchAll 声明不正确,但怎么办?我一辈子都想不通。
(如果你提出一种更有效的方法来完成这一切,我不会感到不安。)
【问题讨论】:
-
您使用 pdo 错误。您应该为要插入的两个变量使用占位符,准备一次语句,然后多次执行它,同时每次提供两个值。
-
Marc B,我修改了我的代码以在缺少的地方使用占位符,但这对结果没有影响。我认为问题在于
fetchAll或更广泛的while。
标签: php mysql arrays pdo mysqli