mysql_real_escape_string и PDO нет соединения в шаблоне MVC - PullRequest
0 голосов
/ 01 марта 2012

Я создал свой собственный шаблон mvc на основе стиля фреймворка codeigniter.Моя проблема сейчас заключается в том, что я хочу предотвратить внедрение SQL, и для этой цели я бы хотел использовать mysql_real_escape_string ().Но когда я его использую, он продолжает выдавать ошибки, так как у него явно нет «ссылки / источника» на базу данных?

Я получаю ошибку php:

Предупреждение: mysql_real_escape_string (): Не удается подключиться к локальному серверу MySQL через сокет '/var/lib/mysql/mysql.sock' (2) в /hsphere/local/home/../dev/simple_blog/models/users_model.phpв строке 8

Предупреждение: mysql_real_escape_string (): не удалось установить ссылку на сервер в /hsphere/local/home/../dev/simple_blog/models/users_model.php в строке 8

Хотя я не совсем понимаю, почему, поскольку я могу получать и извлекать информацию из моей БД, но по какой-то причине я не могу защитить ее ???

Вот моя функция, дающаяошибка

public function getUserByName($username){
    $username = mysql_real_escape_string($username);
    $sql = "SELECT * FROM ".$this->db_table." WHERE username='".$username."' LIMIT 1";
    $q = $this->db->query($sql);

    if($q->rowCount() > 0){
      foreach($q->fetch() as $key => $row){
        $data[$key] = $row;
      }
      return $data;
    }
  }

Как вы можете видеть, я использую mysql_real_escape_string () вверху, а затем, позже, выполняю запрос.Кто-нибудь знает, почему это не работает, и если да, то как бы это исправить?

ПРИМЕЧАНИЕ. Я не акула для PDO, а $ this-> db - это класс PDO.

Ответы [ 3 ]

2 голосов
/ 01 марта 2012

Чтобы использовать mysql_real_escape_string, вам сначала нужно подключиться к серверу базы данных, используя функции MySQL, чего вы, вероятно, еще не сделали.

Вы смешиваете два совершенно разных расширения PHP: mysql и PDO !

Кроме того, вам не нужно экранировать строки, когда вы используете подготовленные операторы PDO, это делается для вас через PDO.1011 * Пример использования PDO:

$userDataStmt = $this->database->prepare('SELECT * FROM ' . $this->db_table . ' WHERE username = :username LIMIT 1');
$userDataStmt->bindValue(':username', $username);
$userDataStmt->execute();
if(!$userDataStmt->rowCount() <= 0)
{
    $result = $userDataStmt->fetchAll();
}
0 голосов
/ 01 марта 2012

Версия PDO PDO::quote(). Смотри http://php.net/manual/en/pdo.quote.php

Так что в вашем случае это будет

$username = $this->db->quote($username);

Однако большинство рекомендует использовать подготовленные операторы PDO, чтобы избежать внедрения SQL-кода в PDO. Увидеть http://php.net/manual/en/pdo.prepared-statements.php

0 голосов
/ 01 марта 2012

Не делай этого. ЗОП спасется для вас, если вы используете готовые заявления:

$stmt = $this->db->prepare("SELECT * FROM ".$this->db_table." WHERE username=:user LIMIT 1";
$stmt->bind(':user', $username);
$stmt->execute();

PDO использует (я полагаю) библиотеку mysqli за кулисами. mysql_escape_real_string использует библиотеку mysql (обратите внимание на отсутствие i). Обе библиотеки имеют полностью независимые пулы соединений, поэтому, если вы не установите одноразовую ссылку с mysql_connect(), вы не сможете использовать mysql_real_escape_string в любом случае, так как для этого требуется активное соединение с БД.

...