PHP商品列表排序功能求助:语法错误修复与无刷新排序实现
问题解决指南
一、修复语法错误
你的代码有两个核心语法问题导致Parse error:
if条件格式错误:PHP中
if的条件必须用()包裹,且值比较要用==(相等判断)而非=(赋值)。例如:
错误写法:if $_GET['Sort'] = 'Popularity'正确写法:
if ($_GET['Sort'] == 'Popularity')所有
elseif也需要做同样修改。代码块未闭合:
if(isset($_GET['Sort']))的代码块末尾缺少},直接衔接外部else导致语法结构混乱,需要在内部else块后添加}闭合外层if。
二、实现下拉选择即时排序
去掉提交按钮,选择选项后自动触发排序,只需给<select>添加onchange事件自动提交表单:
修改下拉框代码:
echo "<select name='Sort' onchange='document.getElementById(\"mainForm\").submit()'>";
同时移除原提交按钮代码块:
echo "<div class = 'submit'>"; echo "<button type = 'submit' value = 'submit'>Submit</button>"; echo "</div>";
三、优化排序逻辑(减少冗余代码)
原代码大量重复SQL语句,仅ORDER BY部分不同,可统一SQL结构,动态修改排序规则:
// 初始化默认排序规则 $orderBy = "count(OrderProducts.OrderID) DESC"; if(isset($_GET['Sort'])) { switch($_GET['Sort']) { case 'Popularity': $orderBy = "count(OrderProducts.OrderID) DESC"; break; case 'AToZ': $orderBy = "Products.Description ASC"; break; case 'ZToA': $orderBy = "Products.Description DESC"; break; case 'LowToHigh': $orderBy = "Products.Price ASC"; break; case 'HighToLow': $orderBy = "Products.Price DESC"; break; default: $orderBy = "count(OrderProducts.OrderID) DESC"; } } // 统一构建SQL,OFFSET用参数绑定避免注入风险 $sql = "SELECT * FROM Products LEFT JOIN OrderProducts ON Products.ProductID = OrderProducts.ProductID WHERE Description LIKE ? GROUP BY Products.ProductID ORDER BY $orderBy LIMIT 10 OFFSET ?"; $statement = $dbh->prepare($sql); $statement->bindValue(1, "%".$safeSearchString."%", PDO::PARAM_STR); $statement->bindValue(2, $currentPage * 10, PDO::PARAM_INT); $statement->execute();
四、修复分页链接的排序参数
分页跳转时需携带当前排序参数,否则切换页面会回到默认排序:
// 获取并转义当前排序参数 $currentSort = isset($_GET['Sort']) ? htmlspecialchars($_GET['Sort'], ENT_QUOTES, 'UTF-8') : 'Popularity'; echo "<div class = 'PreviousButton'><a href = '?page=$previousPage&search=$safeSearchString&Sort=$currentSort'>Previous Page</a></div>"; echo "<div class = 'NextButton'><a href = '?page=$nextPage&search=$safeSearchString&Sort=$currentSort'>Next Page</a></div><br>";
五、设置下拉框默认选中当前排序
让下拉框默认显示已选中的排序选项:
$currentSort = isset($_GET['Sort']) ? $_GET['Sort'] : 'Popularity'; echo "<select name='Sort' onchange='document.getElementById(\"mainForm\").submit()'>"; echo "<option value='Popularity' ".($currentSort == 'Popularity' ? 'selected' : '').">Popularity</option>"; echo "<option value='AToZ' ".($currentSort == 'AToZ' ? 'selected' : '').">A to Z</option>"; echo "<option value='ZToA' ".($currentSort == 'ZToA' ? 'selected' : '').">Z to A</option>"; echo "<option value='LowToHigh' ".($currentSort == 'LowToHigh' ? 'selected' : '').">Low Price to High Price</option>"; echo "<option value='HighToLow' ".($currentSort == 'HighToLow' ? 'selected' : '').">High Price to Low Price</option>"; echo "</select>";
修复后的核心代码片段
<?php if(isset($_GET['search'])) { $searchString = $_GET['search']; } else { $searchString = ""; } $safeSearchString = htmlspecialchars($searchString, ENT_QUOTES,"UTF-8"); echo "<div class='SearchButton'>"; echo "<form>"; echo "<input name = 'search' type = 'text' value = '$safeSearchString' placeholder = 'Search for Products'/> "; echo "<input type = 'submit'/>"; echo "</form>"; echo "</div>"; // 获取当前排序参数 $currentSort = isset($_GET['Sort']) ? $_GET['Sort'] : 'Popularity'; $safeCurrentSort = htmlspecialchars($currentSort, ENT_QUOTES, 'UTF-8'); echo "<form id = 'mainForm' method = 'GET'>"; echo "<div class = 'SortBy'>"; echo "<label for = 'Sorting'>Sort By: </label>"; echo "<select name='Sort' onchange='document.getElementById(\"mainForm\").submit()'>"; echo "<option value='Popularity' ".($currentSort == 'Popularity' ? 'selected' : '').">Popularity</option>"; echo "<option value='AToZ' ".($currentSort == 'AToZ' ? 'selected' : '').">A to Z</option>"; echo "<option value='ZToA' ".($currentSort == 'ZToA' ? 'selected' : '').">Z to A</option>"; echo "<option value='LowToHigh' ".($currentSort == 'LowToHigh' ? 'selected' : '').">Low Price to High Price</option>"; echo "<option value='HighToLow' ".($currentSort == 'HighToLow' ? 'selected' : '').">High Price to Low Price</option>"; echo "</select>"; echo "</div>"; echo "</form>"; if(isset($_GET['page'])) { $currentPage = intval($_GET['page']); $currentPage = $currentPage < 0 ? 0 : $currentPage; } else { $currentPage = 0; } $nextPage = $currentPage + 1; $previousPage = $currentPage - 1; $dbh = connectToDatabase(); // 动态设置排序规则 $orderBy = "count(OrderProducts.OrderID) DESC"; if(isset($_GET['Sort'])) { switch($_GET['Sort']) { case 'Popularity': $orderBy = "count(OrderProducts.OrderID) DESC"; break; case 'AToZ': $orderBy = "Products.Description ASC"; break; case 'ZToA': $orderBy = "Products.Description DESC"; break; case 'LowToHigh': $orderBy = "Products.Price ASC"; break; case 'HighToLow': $orderBy = "Products.Price DESC"; break; default: $orderBy = "count(OrderProducts.OrderID) DESC"; } } // 统一SQL查询 $sql = "SELECT * FROM Products LEFT JOIN OrderProducts ON Products.ProductID = OrderProducts.ProductID WHERE Description LIKE ? GROUP BY Products.ProductID ORDER BY $orderBy LIMIT 10 OFFSET ?"; $statement = $dbh->prepare($sql); $statement->bindValue(1, "%".$safeSearchString."%", PDO::PARAM_STR); $statement->bindValue(2, $currentPage * 10, PDO::PARAM_INT); $statement->execute(); // 输出商品列表 while($row = $statement->fetch(PDO::FETCH_ASSOC)) { $ProductID = htmlspecialchars($row['ProductID'], ENT_QUOTES, 'UTF-8'); $Price = htmlspecialchars($row['Price'], ENT_QUOTES, 'UTF-8'); $Description = htmlspecialchars($row['Description'], ENT_QUOTES, 'UTF-8'); echo "<div class = 'productBox'>"; echo "<a href='ViewProduct.php?ProductID=$ProductID'><img src = 'IFU_Assets/ProductPictures/$ProductID.jpg' /></a>"; echo "$Description <br/><br/>"; echo "$$Price <br/>"; echo "</div> "; } // 分页链接携带排序参数 echo "<div class = 'PreviousButton'><a href = '?page=$previousPage&search=$safeSearchString&Sort=$safeCurrentSort'>Previous Page</a></div>"; echo "<div class = 'NextButton'><a href = '?page=$nextPage&search=$safeSearchString&Sort=$safeCurrentSort'>Next Page</a></div><br>"; ?>
内容的提问来源于stack exchange,提问作者Nicko Toumbas
相关产品推荐
相关产品推荐

