【问题标题】:PDO Update with PHP and Arrays使用 PHP 和数组更新 PDO
【发布时间】:2014-04-18 19:04:37
【问题描述】:

我有一个更新语句应该更新数据库中项目的价格,因为项目的数量可能会有所不同,我尝试使用数组然后循环遍历数组。我已经两次检查了所有输入,但似乎无法确定问题所在,基本上没有更新!

这是我在 POST 请求中向表单处理器发送的内容

itemid[]    8
itemid[]    3
itemid[]    12
itemid[]    4
itemid[]    13
itemid[]    5
itemid[]    10
itemid[]    6
itemid[]    9
itemid[]    7
itemid[]    2
itemid[]    15
itemid[]    11
itemid[]    14
itemid[]    1
price[] 0.0
price[] 0.0
price[] 0.0
price[] 0.0
price[] 0.0
price[] 0.0
price[] 0.0
price[] 0.0
price[] 0.0
price[] 0.0
price[] 1
price[] 0.0
price[] 0.0
price[] 0.0
price[] 0.0
shopid  3
tag prices

和我的处理代码

else if($tag == 'prices')
{
    $shopid = $_POST['shopid'];
    $itemid = $_POST['itemid'];
    $price = $_POST['price'];


    foreach($itemid as $key => $n)
    {
        $db = new PDO('mysql:host=localhost;dbname=servershop', '$user', '$pass');
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $stmt = $db->prepare("UPDATE prices SET price = ? WHERE item_id = ? and shop_id = ?");
        $stmt->bindValue(1, $price[$key]);
        $stmt->bindValue(2, $n);
        $stmt->bindValue(3, $shopid);
        $stmt->execute();
    }
}

最后是我应该更新的表格:

shop_id(int),item_id(int),price(double)
3,1,0
3,2,0
3,3,0
3,4,0
3,5,0
3,6,0
3,7,0
3,8,0
3,9,0
3,10,0
3,11,0
3,12,0
3,13,0
3,14,0
3,15,0

我有 PHP 错误和 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);已启用,但 firebug 控制台中未显示错误。

谁能指出我哪里出错了?

谢谢

【问题讨论】:

  • 为什么 PHP 错误会出现在 Firebug 控制台中?尝试调试代码以查看使用哪些变量值实际执行的部分。如果您手头没有分步调试器,请在代码中使用var_dump 语句。
  • 你知道吗,我不知道!我在想我会因为某种原因在响应中看到错误,但是我没有响应,因为出了点问题,我在写这篇文章时正在下载 PHPStorm,甚至 var_dump 也没有显示任何东西,也许我称之为一个ajax请求??无论如何,我会看看我是否可以在 PHPstorm 中解决它
  • 好的,对于 AJAX 请求,您应该查看 Firebug 控制台中的响应。但是如果它是空的,你可能还有一些 PHP 设置会阻止显示错误(即display_errorsdisplay_startup_errorserror_reporting
  • 只是 error_reporting(E_ALL);

标签: php mysql arrays pdo


【解决方案1】:

有趣的是我不能发表评论。我不知道您使用的是什么版本的 PHP,但我注意到的一件事是:

'$user', '$pass'

如果这是实际代码,那么这些变量可能没有被插值。根据我的理解,单引号内的值通常不会扩展。可能是您与数据库的连接失败(例如,尝试使用文字 '$user' 和 '$pass' 进行连接)。

此外,您实际上只需要准备一次语句并在循环中重新绑定参数。

【讨论】:

  • 嗨,克里斯,这些不是实际代码,只是添加了这个来隐藏我的测试用户名密码,这些密码是硬编码的
【解决方案2】:

您将 itemid 作为价格的键提交,这很好,但您没有将这些键与价格相关联。要么迭代商品 ID,然后在价格数组上使用 current() 和 next(),要么用 itemid 中的键填充价格数组。

$new_array = array_fill_keys($itemid,$price);

foreach($new_array as $key => $n)
    ....
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-27
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多