我试图将脚本转换为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;
}
}
答案 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);
返回单行作为关联数组。
当然,有错误处理的机会,但我将这些作为练习留给读者。
希望有所帮助。