【问题标题】:How to use prepared statements (named parameters) on a php Class如何在 php 类上使用准备好的语句(命名参数)
【发布时间】:2012-10-03 13:46:06
【问题描述】:

我想知道如何在带有 pdo 类的准备好的语句中使用命名参数,所以对 pdo 的调用如下所示。

$query = $bdd->prepare('SELECT * FROM table WHERE login = :login AND pww = :pww');
$query->execute(array('login' => $login, 'pww' => $pww));

我想把它集成到一个类上,不管参数的数量是多少。

目前,我有this 代码

require_once 'constants.php';

class Mysql extends PDO {

    private $con;

    public function __construct() {
        try {
            $this->con = parent::__construct(DB_DSN, DB_USER, DB_PASS);
            if ($this->getAttribute(PDO::ATTR_DRIVER_NAME) == DB_TYPE)
                $this->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, TRUE);
            return $this->con;
        } catch (PDOException $e) {
            die('Error:' . $e->getMessage());
        }
    }

    public function select($reqSelect) {
        try {
            $this->con = parent::beginTransaction();
            $result = parent::prepare($reqSelect);
            $result->execute();

            //$this->con = parent::commit();
            $this->con = parent::rollBack();
            return $result;
            $result->closeCursor();
        } catch (Exception $e) {
            die('Error:' . $e->getMessage());
        }
    }

    public function selectAll($reqSelect) {
        $result = parent::prepare($reqSelect);
        $result->execute();
        $resultat = $result->fetchAll();
        return $resultat;
        $result->closeCursor();
    }
}

对于参数,我使用类似的东西(这是错误的并且容易被注入)

require_once 'classes/Mysql.class.php';
$mysql = new Mysql();
$sql = 'SELECT * FROM articles WHERE id = '.$_GET['id'].' LIMIT 1';
$data = $mysql->select($sql);

谢谢。

【问题讨论】:

  • 我不太明白这个问题或问题。
  • +1 尝试使用 PDO
  • 澄清一下,您想将 sql 查询传递给一个方法,该方法将解析字符串以从 where 子句获取用户输入并将其替换为 ?,准备语句并绑定抓取的用户输入?
  • @PLB:是的!类似的,我解析 sql 字符串的方法和(可能带有一些附加方法的参数)只要有一个“:someting”它的参数,并绑定它,不管参数的数量。
  • 我只是对其进行硬编码,但想法是pastebin.com/ViZfuwk0,并使其更灵活、不受约束或指定的命名参数数量。

标签: php class pdo prepared-statement named-parameters


【解决方案1】:

看来我已经想通了,诀窍是在函数中添加一个可选参数,只要你需要使用准备好的语句(命名参数),就可以使用它。 所以函数类似于

public function selectAll($reqSelect, $param = null) {
    $result = parent::prepare($reqSelect);
    //Check whether the parameter was passed or not
    if (is_null($param)) {
        $result->execute();
        $resultat = $result->fetchAll();
        return $resultat;
    } else {
        //Binding the parameters
        $result->execute($param);
        $resultat = $result->fetchAll();
        return $resultat;
    }
    $result->closeCursor();
}

对于应用它,它就像

//First param, the SQL. Here we have named parameters, so we need them to get bind
$sql = 'SELECT * FROM articles WHERE publish = :number';
//Second param, the parameters that will get bind with the named ones
$param = array(':number' => 1);

$query = $mysql->selectAll($sql, $param);

foreach ($query as $row) {
    extract($row);
    echo $title . '<br />';
}

我不知道这是否被认为是最佳实践、安全甚至正确。如果我弄错了,请随时纠正我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2021-06-04
    • 1970-01-01
    • 2015-06-27
    相关资源
    最近更新 更多