У меня есть несколько старых запросов mysql_query в моем коде, который я хочу преобразовать в PDO, но я изо всех сил стараюсь работать.
мой оригинальный код был:
mysql_query("UPDATE people SET price='$price', contact='$contact', fname='$fname', lname='$lname' WHERE id='$id' AND username='$username' ") or die(mysql_error());
теперь я пытаюсь:
$sql = "UPDATE people SET price='$price', contact='$contact', fname='$fname', lname='$lname' WHERE id='$id' AND username='$username'"; $q = $conn->query($sql) or die("failed!");
но, похоже, не может заставить его работать, какие-либо идеи?
ОБНОВЛЕННЫЙ КОД:
$conn = new PDO("mysql:host=$host;dbname=$db",$user,$pass); // check if the form has been submitted. If it has, process the form and save it to the database if (isset($_POST['submit'])) { // confirm that the 'id' value is a valid integer before getting the form data if (is_numeric($_POST['id'])) { // get form data, making sure it is valid $id = $_POST['id']; $fname = mysql_real_escape_string(htmlspecialchars($_POST['fname'])); $lname = mysql_real_escape_string(htmlspecialchars($_POST['lname'])); $contact = mysql_real_escape_string(htmlspecialchars($_POST['contact'])); $price = mysql_real_escape_string(htmlspecialchars($_POST['price'])); // check that firstname/lastname fields are both filled in if ($fname == '' || $lname == '' || $contact == '' || $price == '' ) { // generate error message $error = 'ERROR: Please fill in all required fields!'; //error, display form renderForm($id, $fname, $lname, $contact, $price, $error); } else { // save the data to the database $username = $_SESSION['username']; $query = "UPDATE people SET price=?, contact=?, fname=?, lname=? WHERE id=? AND username=?"; $stmt = $db->prepare($query); $stmt->bindParam(1, $price); $stmt->bindParam(2, $contact); $stmt->bindParam(3, $fname); $stmt->bindParam(4, $lname); $stmt->bindParam(5, $id); $stmt->bindParam(6, $username); $stmt->execute(); // once saved, redirect back to the view page header("Location: view.php"); }
Для получения дополнительной информации перейдите по этой ссылке: PHP PDO
основанный на вашем примере,
<?php $query = "UPDATE people SET price=?, contact=?, fname=?, lname=? WHERE id=? AND username=?"; $stmt = $dbh->prepare($query); $stmt->bindParam(1, $price); $stmt->bindParam(2, $contact); $stmt->bindParam(3, $fname); $stmt->bindParam(4, $lname); $stmt->bindParam(5, $id); $stmt->bindParam(6, $username); $stmt->execute(); ?>
PDO Подготовленные заявления и хранимые процедуры
Обратите внимание, что при работе с драйвером mysql для PDO вы всегда должны отключать эмулированные подготовленные инструкции :
$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass'); $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = 'UPDATE people SET'; $sql.= ' price = :price,'; $sql.= ' contact = :contact,'; $sql.= ' fname = :fname,'; $sq;.= ' lname = :lname'; $sql.= ' WHERE id= :id AND username = :username'; $stmt = $pdo->prepare($sql); $stmt->execute(array( ':price' => $price, ':contact' => $contact, ':fname' => $fname, ':lname' => $lname, ':id' => $id, ':username' => $username, ));
Как вы можете видеть, я использовал именованные параметры, потому что, когда у вас их много, это более понятно, чем вы занимаетесь.
Обратите внимание: что ircmaxell в настоящее время работает над тем, чтобы по умолчанию всегда использовались реальные подготовленные операторы , но до этого (что может занять некоторое время) вы всегда должны отключать их для mysql.
Если вы собираетесь использовать PDO, вам нужно посмотреть на prepare()
и execute
иначе, если вы потеряете безопасность, которую PDO предлагает и сохраняет SQL-инъекции. Итак, учитывая ваш пример:
$conn = new PDO(/*connection info*/); $query = $conn->prepare("UPDATE people " . "SET price = :price, " . " contact = :contact, " . " fname = :fname, " . " lname = :lname " . "WHERE id = :id " . " AND username = :username"); $result = $query->execute(array( ':price' => $price, ':contact' => $contact, ':fname' => $fname, ':lname' => $lname, ':id' => $id, ':username' => $username ));
Это более слабый способ, но вы также можете bindParam
и быть явным в отношении типа данных, который он ожидает.
Немногие вещи, которые вы должны быть ясными при использовании расширения PDO, это то, что есть несколько способов добиться результата.
То, как вы в настоящее время используете, является одним из них, включая несколько других. Однако всегда рекомендуется связывать параметры по отдельности, поскольку это предотвращает многие проблемы, такие как SQL Injection и многие другие.
Другие важные вещи, на которые нужно обратить внимание, – это statement
, prepare
и execute
.
$conn = new PDO("...."); //Creating the handler //Create the statement $stmt = $conn -> prepare("UPDATE people SET price = :price, contact = :contact, fname = :fname, lname = :lname WHERE id= :id AND username = :username"); // Bind the params $stml -> bindParam(":contact", $contact, PDO::PARAM_STR); //This way you can also define the DATATYPE of the parameter //Execute $stmt -> execute(array( ":price" => $price, //another way of binding the params ":fname" => $fname, ":lname" => $lname, ":id" => $id, ":username" => $username));