2016-02-10 14 views
0

我必须处理大型的mysql数据库。 SQL查询有很多计算(在select子句中)以及where子句中的几种条件。所以,我决定使用行/直接sql查询来处理数据库通过使用$db = ConnectionManager::getDataSource('default');在Cakephp中,如果我使用直接mysql队列而不是使用模型,如何防止sql注入?

如果我使用这个,我如何防止SQL注入在MySQL查询? “mysql_real_escape_string”不再存在。有没有办法在CakePHP中使用PDO?

+0

为什么要绕过使用CakePHP查询数据库的方法?有什么特别的你不能做?使用像Cake这样的框架的一个主要好处是您不必担心SQL注入,因为框架已经为您处理了这个问题! – drmonkeyninja

+0

数学计算必须在'select'查询中,而cakephp find()不能实现。 * - 我不确定这是否可行,它一个接一个地给了我错误。如果我使用'模型',系统花费很长时间来加载或有时会出现内存耗尽问题。但是如果我使用row sql,请快速回复。表中有数百万的数据。 – Sadee

+0

'find()'应该可以在计算中正常工作。您可以在选择的查询中使用SQL方法。你正在使用哪个版本的CakePHP?也许你应该问如何在你的CakePHP查询中使用计算,而不是绕过Cake已经存在的保护来防止SQL注入! – drmonkeyninja

回答

2

你可以在你的控制器(或部件)

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

这是我结束-了使用。使用PDO已解决数千个问题。现在系统速度很快,没有内存排气错误。在我的问题中,我不能把所有问题,错误都归咎于我。直接回答,而不是试图在这里改变问题是很好的!

1

CakePhp的重要一点是不要这样做。所以我会建议不要这样做。

Cakephp有自己的访问数据库的实现,你应该尽可能使用它。你有没有特别的理由想要绕过它?

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

相关问题