Я пытаюсь склонить голову над подготовленными заявлениями.Как включить следующий INSERT в подготовленный оператор, чтобы он был безопасным?
В принципе, я хотел бы сделать вставку, как правило, так:
$sql = '
INSERT INTO customers
(customer_first, customer_last, customer_address, customer_email)
VALUES
(' . mysql_real_escape_string($_POST['customer_first']) . ',
' . mysql_real_escape_string($_POST['customer_last']) . ',
' . mysql_real_escape_string($_POST['customer_address']) . ',
' . mysql_real_escape_string($_POST['customer_email']) . ' )
';
mysql_query($sql);
Из того, что мне сказали, однако есть более безопасный способ сделать это с помощью заранее подготовленных заявлений.
До сих пор я думаю, что это делается так:
$stmt = $dbh->prepare("INSERT INTO customers (customer_first, customer_last, customer_address, customer_email) VALUES (:customer_first, :customer_last, :customer_address, :customer_email)");
$stmt->bindParam(':customer_first', $_POST['customer_first']);
$stmt->bindParam(':customer_last', $_POST['customer_last']);
$stmt->bindParam(':customer_address', $_POST['customer_address']);
$stmt->bindParam(':customer_email', $_POST['customer_email']);
$stmt->execute();
Правильно ли это? Или есть лучший способ сделать то, что я пытаюсь достичь? Если я попробую выше, я получаю сообщение об ошибке «Вызов функции-члена prepare() для не-объекта» - что это значит?
Я использую примеры @http://php.net/manual/en/pdo.prepared-statements.php. Это относится к $ dbh - откуда это получается? Предполагается ли, что $ dbh ссылается в другом месте? Предполагаю, что это связано с соединением с базой данных?
В дополнение к этим вопросам, могу ли я использовать такие вещи, как mysql_insert_id() или mysql_error(), с помощью подготовленных операторов, как указано выше?
Помимо некоторых проверок, зависящих от приложения (принудительное использование имени не является пустым и т. Д.), Это кажется ОК, как в SQL-инъекции. Имейте в виду, что вы также можете отказаться от вызовов '-> bindParam()' и просто вызвать '$ dbh-> execute ($ _ POST);' – Wrikken
+1 - Это такие вопросы, которые подтверждают мою веру в разработчиков. Обычно люди настолько защищают свои встроенные SQL-конкатенации. – David
Они эквивалентны мне. FYI: PreparedStatements не может помочь динамическим параметрам для предложения IN - должен выполняться как динамический SQL. –