PHPとSQLをコンパクトにまとめたいです
部分一致検索して商品が見つかった場合はその商品だけを表示して、もし検索して見つからなかったときはエラーメッセージと商品一覧を表示しています。動作上は問題ありませんが、コンパクトにまとめることは可能でしょうか?
// ユーザーが検索した場合の処理
if (isset($_POST['keyword']) === TRUE && mb_strlen ($_POST['keyword']) > 0) {
$keyword = trim($_POST['keyword']);
try {
$sql = 'SELECT product.id, name, price, img, status, stock
FROM product
JOIN item_stock
ON product.id = item_stock.stock_id
WHERE name like ?';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1, $keyword, PDO::PARAM_STR);
// SQLを実行
$stmt->execute(['%' . $keyword . '%']);
$result = $stmt->fetchALL();
// 上記で検索した名前と部分一致する商品を探す
if (count($result) > 0 ) {
$msg[] = ($keyword . 'を含む商品が見つかりました!');
} else {
try {
// ステータスが1(公開)の販売商品のみを一覧で表示する
$sql = 'SELECT product.id, name, price, img, status, stock
FROM product
JOIN item_stock
ON product.id = item_stock.stock_id
WHERE status = 1';
$stmt = $dbh->prepare($sql);
$stmt->execute();
//全て取得するのでfetchALLでレコードを取得する
$result = $stmt->fetchALL();
$err_msg[] = ($keyword . 'を含む商品は見つかりませんでした。');
} catch (PDOException $e) {
$err_msg[] = '商品を取得できませんでした。';
}
}
} catch (PDOException $e) {
$err_msg[] = '商品を検索できませんでした。';
}
} else {
try {
// ステータスが1(公開)の販売商品のみを一覧で表示する。
$sql = 'SELECT product.id, name, price, img, status, stock
FROM product
JOIN item_stock
ON product.id = item_stock.stock_id
WHERE status = 1';
$stmt = $dbh->prepare($sql);
$stmt->execute();
//全て取得するのでfetchALLでレコードを取得する
$result = $stmt->fetchALL();
} catch (PDOException $e) {
$err_msg[] = '商品を取得できませんでした。';
}
}