PHP将旧的mysql_查询更改为PDO

PHP将旧的mysql_查询更改为PDO,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我的代码中有一些旧的mysql_查询,我想将其转换为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 p

我的代码中有一些旧的mysql_查询,我想将其转换为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

    $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驱动程序时,您始终必须:

正如你们所看到的,我使用了命名参数,因为当你们有很多参数的时候,你们所做的事情就更加清晰了


注意:这项工作目前正在进行中,但在此之前(可能需要一些时间),您必须始终为mysql禁用它们。

如果要使用PDO,您需要查看,否则您将失去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
));

这是一种更为宽松的方式,但您也可以明确它所期望的数据类型。

在使用PDO扩展时,您需要明确的几点是,有多种方法可以完成任务

您当前使用的方式是其中之一,包括其他几种。然而,将它们分开总是一个好主意,因为这样可以避免许多问题,比如SQL注入等

其他需要注意的重要事项包括,和


如果要切换到PDO,这是一个好主意,请确保使用SQL占位符。您的旧示例是典型的
mysql\u查询
,它可能容易受到严重的SQL注入问题的攻击。和往常一样,您会遇到哪些错误?“不能让它工作”不是一个有用的诊断。尽管有了改进,你的方法应该可以工作。你能显示完整的代码吗,从哪里开始启动
$conn
?对不起,我应该说得更具体一些,我有一个编辑表单,允许用户编辑他们发布的广告,当他们点击一个广告进行编辑时,它会出现在表单中,以前的值已经从我的数据库回显到文本框中。这仍然可以正常工作(它使用另一个查询),现在当我尝试对表单进行sumbit时,它会出现“mysql\u real\u escape\u string”错误,这对我来说意味着表单正在使用空白数据?因此,我不确定我的PDO查询是否有问题,因为它在使用旧的mysql_查询代码时运行良好,谢谢您的帮助!!是的,将在问题中包含完整的代码:)谢谢您的回复!我已经使用了这个方法,但是我仍然得到mysql\u real\u escape\u字符串错误?这可能是因为我将变量定义为“$fname=mysql\u real\u escape\u string(htmlspecialchars($\u POST['fname'])”;“这在使用PDO时是必要的还是您认为是其他原因?@NeilKumar尝试删除它,PDO会自动为您进行转义<代码>$fname=$\u POST['fname']好的,现在我得到了一个致命错误:对中的非对象调用成员函数prepare()。。。你知道这意味着什么吗?@NeilKumar我想这是因为你使用的是
$db
而不是
$conn
。更改
$db->prepare($query)
$conn->prepare($query)
$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
));
$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));