SQL 中的 LIKE 无效
LIKE in SQL is not working
我正在使用 PDO 运行 这个查询,有没有办法查看查询 return 是否为假?为什么我的查询 return 什么都没有,而我期望得到结果?
$selectsql = "SELECT `firstname`,`surname`,`phone`,`address`,`username`,`StudentID` FROM `student_info` WHERE ? LIKE ?";
$selectstmt = $conn->prepare($selectsql);
$selectstmt->execute(array($searchby,"%{$searchval}%"));
while($data = $selectstmt->fetch(PDO::FETCH_ASSOC)){
echo "
<tr>
<td>{$data['firstname']}</td>
<td>{$data['surname']}</td>
<td>{$data['phone']}</td>
<td>{$data['address']}</td>
<td>{$data['username']}</td>
<td>Delete Account</td>
</tr>
";
var_dump($data);
}
我把 $searchby
和 $searchval
都扔掉了,我觉得它们很好,没有打错什么的。
您的代码存在几个问题。
第一个也是最大的问题是您假设您的查询是正确的,所以您没有检查任何sql错误。 PDO 提供了广泛的异常处理(请参阅此处关于 SO 的 PDO Exception Questions - How to Catch Them 问题)。
这会告诉您不能使用参数来替代准备语句中的字段名称。为什么?因为准备好的语句的工作方式是 MySQL 编译它们并准备它们的执行计划。如果某个字段或 table 在编译时未知,则 MySQL 也无法准备执行计划。这意味着你不能
WHERE ? LIKE ?
在准备好的语句中,您必须在查询中提供字段名称。所以,你可以
WHERE address LIKE ?
但首先要修复异常处理,因为这将使您能够获得实际的错误消息。
您的查询存在问题:
$selectsql = "SELECT firstname`,`surname`,`phone`,`address`,`username`,`StudentID` FROM `student_info` WHERE ? LIKE ?";
where
之后的占位符打乱了您的查询,在 where 子句之后应该有一个列名,顺便说一句,我看到 $searchby
根据用户选择的项目而变化。
您应该注意的一件事是:
Table and Column names cannot be replaced by parameters in PDO.
您的查询应如下所示。
<?php
$search = "%".$searchval."%";
$selectsql = "SELECT `firstname`,`surname`,`phone`,`address`,`username`,`StudentID` FROM `student_info` WHERE $searchby LIKE ?";
$selectstmt = $conn->prepare($selectsql);
$selectstmt->execute([$search]);
$results = $selectstmt->fetch((PDO::FETCH_ASSOC));
if(count($results) > 0){
var_dump($results);
foreach($results as $data):?>
<tr>
<td><?php echo $data['firstname'];?></td>
<td><?php echo $data['surname'];?></td>
<td><?php echo $data['phone'];?></td>
<td><?php echo $data['address'];?></td>
<td><?php echo $data['username'];?></td>
<td>Delete Account</td>
</tr>
<?php
endforeach;
}else{
echo "no results found";
}
?>
我正在使用 PDO 运行 这个查询,有没有办法查看查询 return 是否为假?为什么我的查询 return 什么都没有,而我期望得到结果?
$selectsql = "SELECT `firstname`,`surname`,`phone`,`address`,`username`,`StudentID` FROM `student_info` WHERE ? LIKE ?";
$selectstmt = $conn->prepare($selectsql);
$selectstmt->execute(array($searchby,"%{$searchval}%"));
while($data = $selectstmt->fetch(PDO::FETCH_ASSOC)){
echo "
<tr>
<td>{$data['firstname']}</td>
<td>{$data['surname']}</td>
<td>{$data['phone']}</td>
<td>{$data['address']}</td>
<td>{$data['username']}</td>
<td>Delete Account</td>
</tr>
";
var_dump($data);
}
我把 $searchby
和 $searchval
都扔掉了,我觉得它们很好,没有打错什么的。
您的代码存在几个问题。
第一个也是最大的问题是您假设您的查询是正确的,所以您没有检查任何sql错误。 PDO 提供了广泛的异常处理(请参阅此处关于 SO 的 PDO Exception Questions - How to Catch Them 问题)。
这会告诉您不能使用参数来替代准备语句中的字段名称。为什么?因为准备好的语句的工作方式是 MySQL 编译它们并准备它们的执行计划。如果某个字段或 table 在编译时未知,则 MySQL 也无法准备执行计划。这意味着你不能
WHERE ? LIKE ?
在准备好的语句中,您必须在查询中提供字段名称。所以,你可以
WHERE address LIKE ?
但首先要修复异常处理,因为这将使您能够获得实际的错误消息。
您的查询存在问题:
$selectsql = "SELECT firstname`,`surname`,`phone`,`address`,`username`,`StudentID` FROM `student_info` WHERE ? LIKE ?";
where
之后的占位符打乱了您的查询,在 where 子句之后应该有一个列名,顺便说一句,我看到 $searchby
根据用户选择的项目而变化。
您应该注意的一件事是:
Table and Column names cannot be replaced by parameters in PDO.
您的查询应如下所示。
<?php
$search = "%".$searchval."%";
$selectsql = "SELECT `firstname`,`surname`,`phone`,`address`,`username`,`StudentID` FROM `student_info` WHERE $searchby LIKE ?";
$selectstmt = $conn->prepare($selectsql);
$selectstmt->execute([$search]);
$results = $selectstmt->fetch((PDO::FETCH_ASSOC));
if(count($results) > 0){
var_dump($results);
foreach($results as $data):?>
<tr>
<td><?php echo $data['firstname'];?></td>
<td><?php echo $data['surname'];?></td>
<td><?php echo $data['phone'];?></td>
<td><?php echo $data['address'];?></td>
<td><?php echo $data['username'];?></td>
<td>Delete Account</td>
</tr>
<?php
endforeach;
}else{
echo "no results found";
}
?>