PHP将旧的mysql_查询更改为PDO
我的代码中有一些旧的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_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));