在 PHP 中使用 PDO 从多个表中搜索的更好方法是什么?

我有一个 HTML 表单,其中有一个用于输入产品名称的搜索字段,下面是复选框,每个复选框对应一个要搜索产品名称的商店。用户可以通过选中复选框从多个商店进行搜索。该表单向服务器发送 GET 请求,其中有一个数据库,其中包含针对不同商店的单独表。


<form action="price.php" method="get">

    <input type="text" id="query" name="query" value="">

    <input type="checkbox" name="shop1" id="shop1">

    <input type="checkbox" name="shop2" id="shop2">

    <input type="submit" name="submit" value="submit">

</form>

因此,在服务器端,我编写了一段 PHP 代码,它将从与用户检查的商店相对应的表中搜索产品名称。由于我将来会添加越来越多的商店,以下哪些 PHP 代码更适合?


版本1


<?php

function search($pdo, $shop) {

if ( isset($_GET[$shop]) && ($_GET['query'] !== "") ) {

    switch ($shop) {

        case "shop1":

            $stmt = $pdo->prepare("SELECT * FROM `shop1` WHERE `name` LIKE :query");

            $stmt->execute(array(":query" => "%". $_GET['query'] . "%"));

            break;

        case "shop2":

            $stmt = $pdo->prepare("SELECT * FROM `shop2` WHERE `name` LIKE :query");

            $stmt->execute(array(":query" => "%". $_GET['query'] . "%"));

            break;

        ...

        ...

        ...

    }


    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

    if ( count($rows) === 0 ) {

        $_SESSION[$shop] = 'nothing found from '. $shop;

        return array();

    } else {

        return $rows;

    }

    } else {

        return array();

    }

}


if ( ! isset($_GET['query']) ) {

    $_SESSION['success'] = "search for an item";

} else {

    $rowsShop1 = search($pdo, "shop1");

    $rowsShop2 = search($pdo, "shop2");

    ...

    ...

    ...

}

?>

版本2


<?php

function search1($pdo, $shop, $sql) {

    $stmt = $pdo->prepare($sql);

    $stmt->execute(array(":query" => "%". $_GET['query'] . "%"));

    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

    if ( count($rows) === 0 ) {

        $_SESSION[$shop] = 'nothing found from '. $shop;

        return array();

    } else {

        return $rows;

    }

}


或者有更好的方法来做到这一点吗?


繁星coding
浏览 94回答 1
1回答

幕布斯7119047

如果小提琴不知何故不再工作,下面是 SQL 代码。(假设MySQL/MariaDB)create table product(    id int auto_increment,    name varchar(255) not null,    constraint product_pk        primary key (id));create table shop(    id int auto_increment,    name varchar(255) not null,    constraint shop_pk        primary key (id));create table product_shop(  id int auto_increment,  product_id int,  shop_id int,  quantity int not null default 0,  constraint product_shop_pk      primary key (id));alter table product_shop    add constraint product_shop_product_fk        foreign key (product_id) references product (id);alter table product_shop    add constraint product_shop_shop_fk        foreign key (shop_id) references shop (id);
打开App,查看更多内容
随时随地看视频慕课网APP