Php PDO Prepared语句即使是MySQL语句也不返回任何内容
我在课堂上为一个项目做了一些php开发,我遇到了一个问题 当与我自己输入的参数一起使用时,以下函数应该返回true,但它返回false:Php PDO Prepared语句即使是MySQL语句也不返回任何内容,php,database,class,pdo,Php,Database,Class,Pdo,我在课堂上为一个项目做了一些php开发,我遇到了一个问题 当与我自己输入的参数一起使用时,以下函数应该返回true,但它返回false: public function check_if_in($table, $condition){ $request="SELECT *"; // Selecting one column $request=$request.' FROM '.$table.' WHERE '; // From the table i want to check
public function check_if_in($table, $condition){
$request="SELECT *"; // Selecting one column
$request=$request.' FROM '.$table.' WHERE '; // From the table i want to check in
$keys = array_keys($condition);
foreach($condition as $clé=>$val){
if(!($clé == end($keys))){ // If it's not the last condition
$request = $request.$clé." = :".$clé." AND "; // add AND
}
else{
$request = $request.$clé." = :".$clé.";"; // Add a semicolon
}
}
try {
$statement = $this->pdo->prepare($request); // Prepare the statement
}
catch (PDOException $e){
die("Erreur array :" . $e->getMessage());
}
foreach($condition as $clé=>$val) {
$statement->bindValue($clé, '%'.$val.'%'); // Binding all the parameters
}
try {
$statement->execute();
}
catch (PDOException $e){
die("Error :" . $e->getMessage());
}
if($statement->rowCount() > 0){
return true;
}
else {
return false;
}
}
请问问题出在哪里?您的问题似乎是查询和绑定的变量的组合: 查询的构建方式如下:
// You use `=` to compare values
$request = $request.$clé." = :".$clé
// You use `%` characters as if it is a `LIKE`
$statement->bindValue($clé, '%'.$val.'%');
^ ^ here you have a problem
您可以像这样绑定变量:
// You use `=` to compare values
$request = $request.$clé." = :".$clé
// You use `%` characters as if it is a `LIKE`
$statement->bindValue($clé, '%'.$val.'%');
^ ^ here you have a problem
您使用的是%
符号,就像在条件下使用通配符一样,但您使用的是=
现在,您的查询正在查找由%
符号包围的文本字符串。这(可能…)是不存在的
因此,要么使用像
而不是=
,要么去掉绑定变量的%
字符:
$statement->bindValue($clé, $val);
如果您使用的语句不正确,关键是不要连接任何字符串,其中包括您的表名(除非以另一种方式验证,因为您当前的代码容易受到SQL注入的影响)。您好,用户在任何时候都不会输入表名,我自己定义它。编辑:这个函数将在多个php页面中使用,这是我老师的命令,它会呼应您的查询,只是为了验证它看起来是否正确,然后将它直接提交到您的数据库中,并使用引用的值。如果你有访问数据库服务器的权限,你可以在运行脚本之前打开MySQL日志(SET GLOBAL general_log=1;
),然后关闭它,并检查MySQL日志以找到它正在传递的确切查询。嗨,本来可以这样做,但因为我在大学,我不能这样做。或者,去掉函数中的所有循环,并将其替换为$statement->execute($condition)
@GrumpyCrouton True,还有改进的余地:-)您好,这仍然返回了一个空数组,让我试试$statement->execute($condition)这件事。仍然是一个空数组,下面是$statement->debugDumpParams(),如果您需要它:SQL:[74]从UserialTur中选择*,其中username=:username和passwd=:passwd;参数:2键:名称:[9]:用户名参数号=-1名称=[9]“:用户名”是\u参数=1参数类型=2键:名称:[7]:密码参数号=-1名称=[7]“:密码”是\u参数=1参数类型=2权限,发现问题。我在每个语句中都加了双引号,以后我可能会重新添加它们(因此它会检查“myusername”而不是“myusername”)。谢谢你的帮助,祝你度过愉快的一天!