【问题标题】:OOP: Function to check if value is in databaseOOP:检查值是否在数据库中的函数
【发布时间】:2012-10-23 17:23:18
【问题描述】:

我正在尝试创建一个用户管理系统类,我的功能之一是检查一个值是否在数据库的列中。它什么也不返回。

以下是相关信息:

require("opperators/connect.php");
class UserManagemen
{
protected $db;

public function __construct(PDO $db)
  {
    $this->db = $db;
  }
public function isInDatabase($checkIfThis, $isHere)
  {
    $stmt = $db->prepare("SELECT 1 from users WHERE $isHere = :$isHere");
    $stmt->execute(array(':$isHere' => $checkIfThis));
        if ($stmt->rowCount() > 0) {
        echo "It's in the database";
        } else {
        echo "Not in the database and you are good to go!";
        }
   }
}
$usermanagement = new UserManagemen($db, null, null, null);
$usermanagement->isInDatabase(Batman, username);

在connect.php中:这在我的程序编码测试中有效。

$configurator['database'] = array(
'username' =>   'root',
'password' =>   'root',
'host' =>    'localhost',
'db' =>    'girlscouts',
);
$options  = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
);
try {
$db = new PDO("mysql:host={$configurator['database']['host']};dbname={$configurator['database']['db']};charset=utf8", $configurator['database']['username'], $configurator['database']['password'], $options);
}
catch (PDOException $ex) { 
die("Failed to connect to the database: " . $ex->getMessage());
}

如果有人反复询问,我提前道歉,我已经尝试了谷歌但没有返回任何有价值的东西,可能是因为我不知道谷歌是什么。我不喜欢寻求帮助,但我会试一试。

【问题讨论】:

  • WHERE 子句中不需要= 吗?
  • 加上 anrewsi 所说的,看起来 php 错误报告已关闭,否则它会告诉您查询中有错误。然后,您可以使用 php 找出问题所在,并得出与 andrewsi 相同的结论。
  • 当然可以!修复它并测试它。还没有改变最终结果,但它确实是一个必要的改变,证明我需要更多的咖啡。
  • @rococopolkadotbandit - 实际上......我认为你的if 声明是错误的。如果您的查询返回行,那么您已找到数据,但您当前正在回显“不在数据库中”行。
  • 是的,修复了 if 语句。我将努力弄清楚什么是错误报告以及如何打开它。

标签: php


【解决方案1】:

我觉得应该是的

if ($stmt->rowCount() > 0) { // data available
    echo "It's in the database";
} else {
    echo "Not in the database and you are good to go!";
}

而不是

if ($stmt->rowCount() > 0) {
    echo "Not in the database and you are good to go!";
} else {
    echo "It's in the database";
}

另外你没有像new PDO(...);那样初始化PDO,在你的构造函数中应该是

$this->db = new PDO(...);

你应该像这样使用它

$stmt=$this->db->prepare(...);
$stmt->execute(...);

详情请查看thisthis

【讨论】:

  • 谢谢!修复了它,但它仍然没有返回任何东西。
  • @rococopolkadotbandit, check this answer.
  • 我已经得到了它,就像在我的介绍帖子中一样。我不知道这些字段是否是必需的,所以我把 null 放在那里。
  • 谢谢,我的连接完全错误,您可能已经确定了错误。短暂休息后,我将不得不重新处理此问题,但是您提供了帮助,我相信我会解决此问题的。非常感谢您的快速响应。我只用了几个星期的 PHP,它已经超出了我的图形设计师的舒适区。
【解决方案2】:

你做错了。

如果这样的值已经存储在表中,你应该在列上设置UNIQUE约束,而不是仅仅为了查看而发出额外的请求。然后,如果您已正确设置 PDO 实例,则插入副本的尝试将产生 PDOException,然后您可以以任何您想要的方式进行处理。

UNIQUE 约束还可以让您在 MySQL 中执行 .. ON DUPLICATE UPDATE .. 构造。

要了解有关 PDO 使用的更多信息,请阅读this tutorial。好像您正在模拟 准备好的语句

【讨论】:

  • 我正在尝试使用准备好的语句,用户名是用户输入,试图在不需要任何白名单的情况下保护数据库,因为我希望我的用户能够使用 š 和撇号等 unicode 字符。我对这一切都非常陌生,所以如果我没有任何意义,我很早就承认我的无知。 Unicode 和特殊字符的使用对于页面的设计至关重要。
猜你喜欢
  • 2016-10-20
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2011-05-16
相关资源
最近更新 更多