【问题标题】:Arrays, going from MySQLi to PDO数组,从 MySQLi 到 PDO
【发布时间】: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


【解决方案1】:
   ':id' => '{$user}'

错了。您正在尝试在查询中插入文字 {$u 等。它应该只是

  ':id' => $user

对于合作伙伴也是如此。

记住... PHP 不会在单引号字符串中插入变量。

【讨论】:

  • 已按建议更改。结果没有区别。同样,当我现在运行我的 PDO 代码时,所发生的一切就是将一个用户自己分配为合作伙伴,而不是分配一个合作伙伴圈。
  • 好吧,不要怪 pdo。 pdo 完全按照您的指示执行。开始调试。输出您在每个阶段所做的事情,检查变量是否符合您的预期,等等......
  • 我不是在责怪 PDO。我认为while ($row = $stmt-&gt;fetchAll(PDO::FETCH_COLUMN)) 将等同于while ($row = mysqli_fetch_array($r)),但事实并非如此。
【解决方案2】:

又一个小时的搜索和修补,我偶然发现了答案。我不知道为什么它似乎无处共享,但 mysqli_fetch_array 的 PDO 等效项并不是普遍的 fetchAll。在这种情况下,以及许多其他情况下,正确的替代品是 fetch(PDO::FETCH_NUM)

所以,我的代码现在完全按照上面的方式工作,只是有一个变化:

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

代替:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 2014-05-28
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多