如何在 php 类上使用准备好的语句(命名参数)

2023-12-21

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

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

我想将其集成到一个类上,无论参数的数量如何。

目前,我有this http://pastebin.com/kKgSkaKt code

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);

Thanks.


所以看来我已经弄清楚了,诀窍是向函数添加一个可选参数,只要需要使用准备好的语句(命名参数)就可以使用它。 所以这个函数是这样的

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 />';
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 php 类上使用准备好的语句(命名参数) 的相关文章

随机推荐