【问题标题】:PDO Prepared statement returns nothing even tho MySQL Statement doesPDO Prepared 语句即使 MySQL 语句也不返回任何内容
【发布时间】:2019-03-22 05:50:07
【问题描述】:

我一直在为课堂上的一个项目做一些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;
    }
}

请问哪里出了问题?

【问题讨论】:

  • 您错误地使用了准备好的语句,关键是不要连接 any 字符串,其中包括您的表名(除非以另一种方式验证,因为您当前的代码容易受到SQL 注入)。
  • 您好,表名不是用户输入的,我自己定义的。编辑:这个功能是在多个php页面中使用的,这是我老师的命令
  • 尝试回显您的查询只是为了验证它是否正确,然后使用引用的值将其直接提交到您的数据库。如果您有权访问数据库服务器,则可以在运行脚本之前打开 MySQL 日志记录 (SET GLOBAL general_log = 1;),然后将其关闭,然后检查 mysql 日志以找到它正在传递的确切查询。
  • 嗨,我会这样做,但因为我在大学,我不能这样做。

标签: php database class pdo


【解决方案1】:

您的问题似乎是查询和您绑定的变量的组合:

查询是这样构建的:

// 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

您正在使用% 符号,就像您在LIKE 条件中使用通配符一样,但您使用的是=

现在您的查询正在寻找被% 符号包围的文字字符串。哪个(可能...)不存在。

所以要么使用LIKE 而不是=,要么去掉绑定变量的% 字符:

$statement->bindValue($clé, $val);

【讨论】:

  • 或者,去掉函数中的所有循环,用$statement->execute($condition);替换它
  • @GrumpyCrouton 确实,还有改进的余地:-)
  • 嗨,这仍然返回一个空数组,让我试试 $statement->execute($condition) 的事情。
  • 仍然是一个空数组,如果需要,这里是 $statement->debugDumpParams(): SQL: [74] SELECT * FROM Utilisateur WHERE username = :username AND passwd = :passwd;参数:2 键:名称:[9] :username paramno=-1 name=[9] ":username" is_param=1 param_type=2 键:名称:[7] :passwd paramno=-1 name=[7] " :passwd" is_param=1 param_type=2
  • 好的,发现问题。我在每条语句中都加上了双引号,然后我可能会重新添加它们(因此它会检查“我的用户名”而不是“我的用户名”)。感谢您的帮助,祝您有美好的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 2021-07-06
  • 1970-01-01
  • 2012-03-27
相关资源
最近更新 更多