PHP与MySQL搜索:无法从数据库获取完整数据求助
问题分析与解决方案
先帮你解决当前点击链接后无法获取数据的核心问题,再实现你需要的搜索功能。
一、修复详情页无法获取数据的问题
你的read.php存在几个关键问题:
- 缺失数据库连接代码:列表页里你写了数据库连接逻辑,但详情页完全没这段代码,导致
$connection变量不存在,数据库查询根本执行不了。 - 使用已废弃的
mysql_*函数:PHP早就淘汰了这套函数,安全性和兼容性都很差,我帮你换成mysqli扩展(保持和你原有代码的面向过程风格一致)。 - SQL注入风险:直接把
$_GET['id']拼进SQL语句,恶意用户可以轻易篡改你的数据库,必须用预处理语句规避。
修改后的详情页代码(read.php)
<?php // 第一步:先建立数据库连接,和列表页配置一致 $connection = mysqli_connect("localhost", "root", "", "vdl"); // 检查连接是否成功 if (!$connection) { die("数据库连接失败: " . mysqli_connect_error()); } if (isset($_GET['id'])) { // 使用预处理语句防止SQL注入 $id = $_GET['id']; $stmt = mysqli_prepare($connection, "SELECT * FROM digital_library WHERE company_id = ?"); mysqli_stmt_bind_param($stmt, "i", $id); // "i"表示参数是整数类型,如果是字符串就改成"s" mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $row1 = mysqli_fetch_assoc($result); // 根据id查询应该只有一条数据,不用while循环 if ($row1) { ?> <span>Company Name: </span> <?php echo htmlspecialchars($row1['company_name']); ?><br><br> <span>Since: </span> <?php echo htmlspecialchars($row1['since']); ?><br><br> <span>Strength: </span> <?php echo htmlspecialchars($row1['strength']); ?><br><br> <span>Head Quarters: </span> <?php echo htmlspecialchars($row1['head_quarter']); ?><br><br> <span>Location (City): </span> <?php echo htmlspecialchars($row1['locations']); ?><br><br> <span>Development Centers: </span> <?php echo htmlspecialchars($row1['development_centers']); ?><br><br> <span>Customers: </span> <?php echo htmlspecialchars($row1['customers']); ?><br><br> <span>MNC: </span> <?php echo htmlspecialchars($row1['mnc']); ?><br><br> <span>CMMI: </span> <?php echo htmlspecialchars($row1['cmmi']); ?><br><br> <span>Domains: </span> <?php echo htmlspecialchars($row1['domains']); ?><br><br> <span>Industries: </span> <?php echo htmlspecialchars($row1['industries']); ?><br><br> <span>Domain Competitors: </span> <?php echo htmlspecialchars($row1['domain_competitor']); ?><br><br> <span>Products: </span> <?php echo htmlspecialchars($row1['products']); ?><br><br> <span>Services: </span> <?php echo htmlspecialchars($row1['services']); ?><br><br> <span>Uniqueness: </span> <?php echo htmlspecialchars($row1['uniqueness']); ?><br><br> <span>Company URL: </span> <a target='_blank' href="<?php echo htmlspecialchars($row1['url']); ?>"> <?php echo htmlspecialchars($row1['url']); ?> </a><br><br> <!--<span>Company Logo:</span> <?php echo htmlspecialchars($row1['logo']); ?><br><br>--> <span>Onsight: </span> <?php echo htmlspecialchars($row1['onsight']); ?><br><br> <span>Benefits: </span> <?php echo htmlspecialchars($row1['benefits']); ?><br><br> <span>Awards: </span> <?php echo htmlspecialchars($row1['awards']); ?><br><br> <?php } else { echo "没有找到对应的公司信息"; } // 关闭语句和连接 mysqli_stmt_close($stmt); mysqli_close($connection); } else { echo "请通过正确的链接访问"; } ?>
二、修改列表页并添加搜索功能
我同时把列表页的代码也换成mysqli,并加入搜索功能:
<?php $connection = mysqli_connect("localhost", "root", "", "vdl"); if (!$connection) { die("数据库连接失败: " . mysqli_connect_error()); } // 构建查询语句,支持搜索 $query = "SELECT * FROM digital_library"; // 如果有搜索关键词,拼接模糊匹配条件 if (isset($_GET['search']) && !empty(trim($_GET['search']))) { $search = mysqli_real_escape_string($connection, trim($_GET['search'])); // 可以根据需求调整匹配的字段,比如公司名称、领域、行业等 $query .= " WHERE company_name LIKE '%$search%' OR domains LIKE '%$search%' OR industries LIKE '%$search%'"; } $result = mysqli_query($connection, $query); ?> <!-- 搜索表单 --> <form method="GET" action="" style="margin-bottom: 20px;"> <input type="text" name="search" placeholder="搜索公司名称/领域/行业..." value="<?php echo isset($_GET['search']) ? htmlspecialchars($_GET['search']) : ''; ?>"> <button type="submit">搜索</button> </form> <ul> <?php while ($row = mysqli_fetch_assoc($result)) { // 用htmlspecialchars防止XSS攻击 $companyName = htmlspecialchars($row['company_name']); $companyId = htmlspecialchars($row['company_id']); echo "<li><b><a href='read.php?id={$companyId}'>{$companyName}</a></b></li><br>"; } // 关闭数据库连接 mysqli_close($connection); ?> </ul>
额外提示
- 建议把数据库连接信息单独写到一个配置文件(比如
config.php),然后在列表页和详情页里用include 'config.php'引入,避免重复代码。 - 如果你的
company_id是字符串类型,记得把详情页预处理语句里的参数类型从i改成s。
内容的提问来源于stack exchange,提问作者user9740150
相关产品推荐
相关产品推荐

