使用 PDO 选择 MYSQL 中的 PHP 变量 [重复]
Posted
技术标签:
【中文标题】使用 PDO 选择 MYSQL 中的 PHP 变量 [重复]【英文标题】:PHP Variables in MYSQL Select using PDO [duplicate] 【发布时间】:2012-09-30 21:15:57 【问题描述】:可能重复:Find duplicate records in mysql
我是一个新手,正在尝试使用此功能在数据库中查找重复项:
function uni($field, $value)
$sql= "SELECT * FROM user WHERE ".$field." = '".$value."'";
$result = $pdo->query($sql);
$rows = $result->fetchAll(PDO::FETCH_COLUMN, 1);
return count($rows);
$username = $_POST['username'];
$result = uni("username", $username);
...我的头正要撞到一个坚固的东西上。由于某种原因,查询不会返回结果,我不知道为什么。
【问题讨论】:
***.com/questions/854128 将帮助您在数据库中查找重复项。 让我们确切地知道你在什么时候卡住了。 我通过 post 从表单中获取数据,当我回显 $sql 时,语句看起来很好 SELECT * FROMuser
WHERE username
= 'svensenn' 但我没有结果
我在您的代码中没有发现错误检查,所以我想知道您遇到的具体问题是什么。数据库通常可以正常工作,如果您对结果没有信心,您应该查明查询数据库的问题首先出现的位置。这可能需要首先进行基本调试。请在脚本的开头添加error_reporting(~0); ini_set('display_errors', 1);
。此外,您应该 enable error logging 并按照错误日志进行操作。
谢谢你。我已经尝试使用 try/catch 尝试 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); ,但不会出错。谢谢你的提示,我不知道该怎么做。
【参考方案1】:
好的,你正在使用PDO
,很好。但是,您的 sn-p 仍然很容易受到注入攻击:您仍在将原始用户输入传递给查询。此外,如果您只想找到找到的行数,请不要使用SELECT *
,并且不要获取完整的结果集来计算它们!
function uni($field,$value)
$db = new PDO();//make connection, which you don't seem to do
//or (not so good approach):
//global $db;
//Best approach would be to pass the connection to the function, as an extra argument, though
$stmt = $db->prepare('SELECT '.$field.' FROM user WHERE '.$field.' = :value');
if ($stmt->execute(array(':value' => $value)))
return $stmt->rowCount();
//query failed, throw errors or something
阅读docs 了解更多示例。无论如何,您的代码应该如下所示:
function uni($field,$value,$db)
$stmt = $db->prepare('SELECT '.$field.' FROM user WHERE '.$field.' = :value');
if ($stmt->execute(array(':value' => $value)))
return $stmt->rowCount();
return false;
$username = $_POST['username'];
$result = uni('username', $username,$pdo);//<--pass connection
【讨论】:
...感谢您的详细解释。 @SvenFischer:很高兴我能帮上忙。我必须说,这只是解决最“紧急” 的问题(让代码工作)。我遗漏了很多东西(比如为什么应该避免使用SELECT *
,为什么不应该获取结果,......为什么 Bobby Tables 会发现你的代码非常有趣......)。只需谷歌这三件事,了解更多;我保证,这很值得你花时间【参考方案2】:
您在函数中使用了对 $pdo
对象的引用,但未定义 $pdo
对象。
function uni($field, $value)
$sql= "SELECT * FROM user WHERE ".$field." = '".$value."'";
$result = $pdo->query($sql);
// ^^ undefined object
$rows = $result->fetchAll(PDO::FETCH_COLUMN, 1);
return count($rows);
要么将 $pdo 传递给您的函数,要么将其设为全局函数。
打开错误报告,这样您就可以看到代码中的错误在哪里。
【讨论】:
我有 include ("dbconnect.php"); 我应该在函数内部使用它吗? 查看我的答案,将其传递给function uni($pdo, $field, $value)
之类的函数或将其设为global $pdo
以上是关于使用 PDO 选择 MYSQL 中的 PHP 变量 [重复]的主要内容,如果未能解决你的问题,请参考以下文章