2013-08-23 3 views
4

Давайте сделаем вид, что у меня есть две таблицы в базе данных InnoDB: categories и jokes; и что я использую PHP/MySQLi, чтобы выполнить эту работу. Таблицы выглядеть так:mysqli, подготовленные заявления и INSERT-SELECTs

CATEGORIES 
id (int, primary, auto_inc) | category_name (varchar[64]) 
============================================================ 
1        knock, knock 

JOKES 
id (int, primary, auto_inc) | category_id (int) | joke_text (varchar[255]) 
============================================================================= 
empty 

Благодаря previous ответ на здесь, я обнаружил, что вы можете сделать следующее, чтобы добавить новую шутку, состоящую из: $joke_text, $category_id.

INSERT INTO jokes (category_id, joke_text) 
SELECT c.id, '$joke_text' 
FROM categories AS c WHERE c.id = $category_id; 

Это позволяет мне, без использования внешних ключей, чтобы быть уверенными, что значение $category_id относится к существующей категории (игнорируйте вопрос о внешних ключах, так как мой вопрос призван помочь мне узнать " сложные "подготовленные заявления).

Так что это сработало просто отлично. Тем не менее, я сейчас пытаюсь выучить подготовленные заявления и, проведя весь день на этом, наконец, у меня есть основы. К сожалению, у меня есть АБСОЛЮТНО НЕТ ИДЕИ как выполнить вышеупомянутый SQL-запрос с подготовленными операциями в mysqli, и я не смог найти какую-либо информацию в Интернете относительно такой проблемы.

Если кто-нибудь может мне помочь, я был бы очень благодарен.

ответ

2

Сначала вы создаете заявление очень похож на нормальное заявление вы сделали

$stmt = $mysqli->prepare("INSERT INTO jokes (category_id, joke_text) 
SELECT c.id, ? 
FROM categories AS c WHERE c.id = ?;"); 

Получить заявление, связанное с параметром «s» означает строковые данные и я для целых

$stmt->bind_param('si', $joke_text,$category_id); // bind to the parameters 

/* выполнить подготовленный отчет */

$stmt->execute(); 
+0

Не спасаясь данные POST с real_escape_string функции Mysqli побеждающей целью использования подготовленных инструкций? Вы используете подготовленные инструкции, чтобы пропустить этот шаг. Иначе вы бы хотели называть функцию addlashes, а затем избегать ее с помощью функции real_escape_string. Или это, по крайней мере, то, что я прочитал, когда сначала использовал MySQLi, прежде чем перейти к PDO. См. [Http://stackoverflow.com/questions/6232084/is-mysql-real-escape-string-necessary-when-using-prepared-statements](http://stackoverflow.com/questions/6232084/is-mysql -real-escape-string-needed-when-using-ready-statements) – Touch

+0

Я согласен, это просто привычка :), которую можно безопасно удалить – skv

+0

Двойное экранирование может привести к двум одинарным кавычкам при отправке.Вот где я вижу проблему безопасности. Лучше всего мы советуем, чтобы эта привычка была удалена. :) – Touch

0

Я действительно писал код, но я действительно что вы искали в Интернете для этого тоже. Поэтому вместо этого я получил ссылку на сайт PHP, где вы можете увидеть многие из них.

Prepared statements

mysqli in general

Поскольку вы учитесь MySQLi, почему бы не просто перейти к PDO вместо этого. Это очень похоже, но я думаю, что это будущее.

http://php.net/manual/en/book.pdo.php

http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

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