2010-09-15 1 views
2

Я пытаюсь склонить голову над подготовленными заявлениями.Как включить следующий 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(), с помощью подготовленных операторов, как указано выше?

+1

Помимо некоторых проверок, зависящих от приложения (принудительное использование имени не является пустым и т. Д.), Это кажется ОК, как в SQL-инъекции. Имейте в виду, что вы также можете отказаться от вызовов '-> bindParam()' и просто вызвать '$ dbh-> execute ($ _ POST);' – Wrikken

+1

+1 - Это такие вопросы, которые подтверждают мою веру в разработчиков. Обычно люди настолько защищают свои встроенные SQL-конкатенации. – David

+0

Они эквивалентны мне. FYI: PreparedStatements не может помочь динамическим параметрам для предложения IN - должен выполняться как динамический SQL. –

ответ

1

Если вы новичок в OOP, вы можете начать с mysqli для более близких знакомых функций и синтаксиса и поддержки функционального программирования, но стоит обратить внимание на PDO class, если вы готовы заняться ООП.

стоит рассмотреть, чтобы помочь решить, с чего начать: mysqli or PDO - what are the pros and cons?

Это относится к $ ДБГ - где это взяли? Предполагается, что $ dbh должен быть , на который ссылается в другом месте - я принимаю его - это что-то общее с базой данных соединение?

$ ДВГ = дескриптор базы данных (как определено в PDO > Connections and Connection Management документ)

Могу ли я использовать такие вещи, как mysql_insert_id() или mysql_error() , используя подготовленные заявления, как выше?

PDO::lastInsertId, PDO::errorInfo

+0

Спасибо за кучи за это. – willdanceforfun

1

Сообщение об ошибке указывает ваша проблема с $dbh объекта - как она инициализируется?

+0

$ dbh = новый PDO ('mysql: host = localhost; dbname = db', $ user, $ pass); – willdanceforfun

+1

Это единственный другой соответствующий код? Правильно ли это выше этой линии? Попробуйте сделать print_r ($ dbh) – philfreo

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