2013-12-12 3 views
7

Как вы избегаете «на доктрине?Как вы избегаете «на учение?

Я сделал этот код

$query = $em->createQuery(
       "SELECT a FROM AcmeTopBundle:ArtData a WHERE 
       a.name = '". mysql_escape_string($name) ."'"); 

но когда $ имя A'z

возвращает ошибку

[Doctrine\ORM\Query\QueryException]   
SELECT a FROM AcmeTopBundle:ArtData a WHERE 
       a.name = 'A\'s' 

Я думаю, что я спасся mysql_escape_string в случае использования сырого SQL ,

Как я могу избежать этой ошибки в доктрине?

ответ

3

на основе https://stackoverflow.com/a/13377430/829533

вы можете использовать подготовленные заявления http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html#using-prepared-statements

Из документации:

$date = new \DateTime("2011-03-05 14:00:21"); 
$stmt = $conn->prepare("SELECT * FROM articles WHERE publish_date > ?"); 
$stmt->bindValue(1, $date, "datetime"); 
$stmt->execute(); 
1

Это не отвечает на ваш вопрос, но объясняет, что не так с вашим кодом. Это не вписывалось в комментарий.

Вы не можете и не должны использовать mysql_escape_string()

  • Это неправильная функция спасения, правая раньше mysql_real_escape_string(). Чтение the documentation звучит не так, но чтобы правильно сбежать, вы должны знать, какая кодировка символов используется. В западных схемах кодирования, таких как ASCII, ISO-8859-x или даже UTF-8, это, вероятно, не имеет значения, но есть некоторые экзотические китайские кодировки, вокруг которых абсолютно необходимо знать, принадлежит ли этот байт " другому байт или приходит это собственное.
  • При использовании mysql_real_escape_string() вам необходимо иметь уже открытое соединение с БД, созданное с помощью mysql_connect(). Если вы этого не сделаете, PHP попытается открыть новое соединение с пользователем и паролем по умолчанию, как определено в файле php.ini. Обычно это приводит к ошибке, поскольку без пароля база данных не позволит вам ничего сделать. Кроме того, если у вас есть успех, то настройка кодировки этого соединения, скорее всего, не та, которая используется в Doctrine.
  • Использование любой из функций mysql_ * неверно, поскольку они устарели. Правильный способ - использовать функции mysqli_ *.
  • Doctrine может использовать любой из трех методов подключения к базе данных: mysql, mysqli или PDO. Вы должны выбрать тот, который действительно используется, если вы хотите вручную вызвать правильную функцию экранирования. Пока соединение уже создано. И каким-то образом вам нужно захватить этот ресурс соединения, чтобы позволить функции, которую вы вызываете, для обнаружения используемой кодировки.

Так что в конце концов существует множество причин, по которым неправильно использовать любое экранирование, которое звучит так, как будто оно выполняет свою работу.

Правильный способ - использовать экранирование слоя базы данных, который вы используете. Если вы используете Doctrine, используйте его для экранирования.Или лучше, избегайте экранирования, используйте подготовленные инструкции или построитель запросов, и пусть Доктрина справится с остальными.

0

Это покажет, как вставить данные в базу данных, где вам обычно нужно использовать real_escape_string.

Учение и Symfony 3, используя приготовленный не QueryBuilder:

// get the post value 
$value = $request->request->get('value'); 

$sql = "INSERT INTO `table_name` 
(`column_name1`,`column_name2`) 
VALUES 
('Static Data',?) 
"; 

$em = $this->getDoctrine()->getManager(); 
$result = $em->getConnection()->prepare($sql); 
$result->bindValue(1, $value); 
$result->execute(); 

Теперь бонус, чтобы получить успех/неудачу, если вы используете автоматическое приращение записи:

$id = $em->getConnection()->lastInsertId(); 

если $ ID имеет значение, то он выполнил вставку. Если вставка не была выполнена.

Смежные вопросы