在Cakephp中,如果我使用直接mysql查询而不是使用模型,如何防止sql注入?

在Cakephp中,如果我使用直接mysql查询而不是使用模型,如何防止sql注入?,php,mysql,cakephp,pdo,Php,Mysql,Cakephp,Pdo,我必须处理大型mysql数据库。Sql查询包含大量计算(在select子句中)和where子句中的几种条件。因此,我决定通过使用$DB=ConnectionManager::getDataSource('default'),使用行/直接sql查询来处理DB 如果我使用这个,我如何防止mysql查询中的sql注入?“mysql\u real\u escape\u string”不再存在。有什么方法可以在CakePHP中使用PDO吗?CakePHP的一大要点是不这样做。因此,我建议不要这样做 Cak

我必须处理大型mysql数据库。Sql查询包含大量计算(在select子句中)和where子句中的几种条件。因此,我决定通过使用
$DB=ConnectionManager::getDataSource('default'),使用行/直接sql查询来处理DB


如果我使用这个,我如何防止mysql查询中的sql注入?“mysql\u real\u escape\u string”不再存在。有什么方法可以在CakePHP中使用PDO吗?

CakePHP的一大要点是不这样做。因此,我建议不要这样做

Cakephp有自己的实现来访问数据库,如果可能的话,您应该使用它。你想绕开它有什么特别的原因吗


如果你真的想,你仍然可以使用mysqli,但我不能推荐它。

cakePhp的一个主要目的是不这样做。因此,我建议不要这样做

Cakephp有自己的实现来访问数据库,如果可能的话,您应该使用它。你想绕开它有什么特别的原因吗


如果你真的想,你仍然可以使用mysqli,但我不能推荐它。

你可以在你的控制器(或组件)中使用它

//启动PDO连接
$this->_pdocon=$this->WhateverYourModel->getDataSource()->getConnection();
试一试{
//选择查询
$company=“What”;
$stmt=$this->pdocon->prepare('SELECT*FROM'agents',其中'company'类似于:company LIMIT 2');
$stmt->bindValue(':company',$company,PDO::PARAM_STR);
//启动事务
$this->_pdocon->begin();
//循环浏览事件
如果($stm->execute()){
而($row=$stmt->fetchAll(PDO::FETCH_ASSOC)){
$stmt2=$this->pdocon->prepare(“插入到'company'中”
(`id`、`name`、`identityno`、`modified`、`created`)
价值观
(NULL,:name,:identityno,NOW(),NOW())”;
$stmt2->bindValue(':name',$row['name'],PDO::PARAM_STR);
$stmt2->bindValue(':identityno',$row['id'],PDO::PARAM_INT);
$stmt2->execute();
}
}
//提交事务
$this->_pdocon->commit();
//获取最后一个插入Id
$row_id=$this->_pdocon->lastInsertId();
变量转储($row\U id);
}捕获(PDO$e){
//回滚事务
$this->_pdocon->rollback();
echo“!PDO错误:“..e->getMessage()”
”; }

这就是我的结局。使用PDO已经解决了数千个问题。现在系统速度快,没有内存耗尽错误。我不能把所有的问题,错误都放在我的问题里。这是好的,给直接的答案,而不是试图改变问题在这里

您可以在控制器(或组件)中使用它

//启动PDO连接
$this->_pdocon=$this->WhateverYourModel->getDataSource()->getConnection();
试一试{
//选择查询
$company=“What”;
$stmt=$this->pdocon->prepare('SELECT*FROM'agents',其中'company'类似于:company LIMIT 2');
$stmt->bindValue(':company',$company,PDO::PARAM_STR);
//启动事务
$this->_pdocon->begin();
//循环浏览事件
如果($stm->execute()){
而($row=$stmt->fetchAll(PDO::FETCH_ASSOC)){
$stmt2=$this->pdocon->prepare(“插入到'company'中”
(`id`、`name`、`identityno`、`modified`、`created`)
价值观
(NULL,:name,:identityno,NOW(),NOW())”;
$stmt2->bindValue(':name',$row['name'],PDO::PARAM_STR);
$stmt2->bindValue(':identityno',$row['id'],PDO::PARAM_INT);
$stmt2->execute();
}
}
//提交事务
$this->_pdocon->commit();
//获取最后一个插入Id
$row_id=$this->_pdocon->lastInsertId();
变量转储($row\U id);
}捕获(PDO$e){
//回滚事务
$this->_pdocon->rollback();
echo“!PDO错误:“..e->getMessage()”
”; }

这就是我的结局。使用PDO已经解决了数千个问题。现在系统速度快,没有内存耗尽错误。我不能把所有的问题,错误都放在我的问题里。这是好的,给直接的答案,而不是试图改变问题在这里

为什么要绕过使用CakePHP查询数据库的方法?有什么特别的事你不能做吗?使用像Cake这样的框架的一个主要好处是,您不必担心SQL注入,因为框架已经为您处理了这个问题!“选择”查询中必须有数学计算,cakephp find()无法实现。*-我不确定这是否可能,它一个接一个地给了我错误。若我使用“model”,系统加载时间太长,或者有时会出现内存耗尽问题。但是,如果我使用行sql,请快速响应。表中有数以百万计的数据。
find()
可以很好地进行计算。您可以在select查询中使用SQL方法。您使用的是哪个版本的CakePHP?也许您应该询问如何在CakePHP查询中使用计算,而不是如何通过绕过已有的保护来防止SQL注入!为什么要绕过使用CakePHP查询数据库的方法?有什么特别的事你不能做吗?使用像Cake这样的框架的一个主要好处是,您不必担心SQL注入,因为框架已经为您处理了这个问题!“选择”查询中必须有数学计算,cakephp find()无法实现。*-我不确定这是否可能,它一个接一个地给了我错误。若我使用“model”,系统加载时间太长,或者有时会出现内存耗尽问题。但是,如果我使用行sql,请快速响应。表中有数以百万计的数据。
find()
// Initiate PDO connection
$this->_pdocon = $this->WhateverYourModel->getDataSource()->getConnection();
try {

    // Select Query
    $company = "What";
    $stmt = $this->_pdocon->prepare('SELECT * FROM `agents` WHERE `company` LIKE :company LIMIT 2');
    $stmt->bindValue(':company', $company, PDO::PARAM_STR);

    // Start transaction
    $this->_pdocon->begin();

    // Loop through the events
    if( $stm->execute() ) {
        while ($row = $stmt->fetchAll(PDO::FETCH_ASSOC)) {
            $stmt2 = $this->_pdocon->prepare("INSERT INTO `company` 
                        (`id`, `name`, `identityno`, `modified`, `created`) 
                        VALUES 
                        (NULL, :name, :identityno, NOW(), NOW())");
            $stmt2->bindValue(':name', $row['name'], PDO::PARAM_STR);
            $stmt2->bindValue(':identityno', $row['id'], PDO::PARAM_INT);
            $stmt2->execute();

        }
    }

    // Commit transaction
    $this->_pdocon->commit();

    // Get last insert Id
    $row_id = $this->_pdocon->lastInsertId();
    var_dump($row_id); 

} catch (PDOException $e) {

    // Rollback transaction
    $this->_pdocon->rollback();

    echo "! PDO Error : " . $e->getMessage() . "<br/>";
}