【问题标题】:Mysql connect to PDO convertMysql 连接到 PDO 转换
【发布时间】:2016-03-29 21:07:28
【问题描述】:

我正在尝试将脚本转换为 PDO 连接,但需要有关这部分脚本的帮助。我已经完成了大部分工作,但由于我必须交换该数组并将其带到会话中,所以他们坚持这部分。

if(!empty($_GET["action"])) {
switch($_GET["action"]) {
    case "add":
        if(!empty($_POST["quantity"])) {
            $productByCode = $handler->query("SELECT * FROM tooted WHERE kood='" . $_GET["code"] . "'");;


            $itemArray = array($productByCode[0]["code"]=>array('name'=>$productByCode[0]["name"], 'code'=>$productByCode[0]["code"], 'quantity'=>$_POST["quantity"], 'price'=>$productByCode[0]["price"]));

            if(!empty($_SESSION["cart_item"])) {
                if(in_array($productByCode[0]["code"],$_SESSION["cart_item"])) {
                    foreach($_SESSION["cart_item"] as $k => $v) {
                            if($productByCode[0]["code"] == $k)
                                $_SESSION["cart_item"][$k]["quantity"] = $_POST["quantity"];
                    }
                } else {
                    $_SESSION["cart_item"] = array_merge($_SESSION["cart_item"],$itemArray);
                }
            } else {
                $_SESSION["cart_item"] = $itemArray;
            }
        }
    break;
    case "remove":
        if(!empty($_SESSION["cart_item"])) {
            foreach($_SESSION["cart_item"] as $k => $v) {
                    if($_GET["code"] == $k)
                        unset($_SESSION["cart_item"][$k]);              
                    if(empty($_SESSION["cart_item"]))
                        unset($_SESSION["cart_item"]);
            }
        }
    break;
    case "empty":
        unset($_SESSION["cart_item"]);
    break;  
}
}

【问题讨论】:

  • 您具体在哪个部分遇到了问题?
  • 不能使用 PDO 作为数组 "不能使用 PDOStatement 类型的对象作为数组" $itemArray = array($productByCode[0]["code"]=>array('name'=>$ productByCode[0]["name"], 'code'=>$productByCode[0]["code"], 'quantity'=>$_POST["quantity"], 'price'=>$productByCode[0][ "价格"]));

标签: php mysql arrays pdo


【解决方案1】:

PDO::query 返回一个PDOStatement 类型的对象,它在旧的mysql_* API 中确实没有类似物。正如错误消息所说,它是一个对象,而不是一个数组;它实际上更像是 MySQL 存储过程中的游标,这意味着获取数据的唯一方法是调用它的 fetch* 方法之一。在您的情况下,这将是 PDOStatement::fetchAll,它返回一个包含所有结果行的数组。

顺便说一句,切换到PDO 的原因之一是准备好的语句 的可用性,这有助于防止您当前的代码特别容易受到SQL injection attack 的攻击。准备好的语句自动处理插入到查询中的变量的正确引用、转义和类型匹配。相关代码是

$sql = "SELECT * FROM tooted WHERE kood = :code";
$stmt = $handler->prepare($sql);
$stmt->execute(array(':code' => $)GET['code']));
$productByCode = $stmt->fetchAll(PDO::FETCH_ASSOC);

这会将$productByCode 设置为一个数字行数组,每行一个关联数组。

如果您知道结果将只包含一行,则可以改为使用

$productByCode = $stmt->fetch(PDO::FETCH_ASSOC);

将单行作为关联数组返回。

当然,也有错误处理的机会,但我把这些留给读者作为练习。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    相关资源
    最近更新 更多