Php PDO Prepared语句即使是MySQL语句也不返回任何内容

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

我在课堂上为一个项目做了一些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 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”)。谢谢你的帮助,祝你度过愉快的一天!