Mysql连接到PDO转换

时间:2016-03-29 21:07:29

标签: php mysql arrays pdo

我试图将脚本转换为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;  
}
}

1 个答案:

答案 0 :(得分: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);

返回单行作为关联数组。

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

希望有所帮助。