mysql_real_escape_string()期望参数1为字符串,给定对象

时间:2015-05-17 05:09:55

标签: php

嘿,我是一个PHP新手,在这里设置了“fetch,post to db,allow delete”项目,我已经获取了数据,打印了数据库行,现在我正在添加删除每一行的功能{ {1}}但我遇到了这个错误。

我在第81行突出显示了astricks以及上下两个注释块,因此您可以轻松找到它。

感谢您帮助我学习。

'$id'

4 个答案:

答案 0 :(得分:5)

你的问题出在这一行(有错误的那一行)

$id = mysql_real_escape_string($connection, $_POST['id']);

而应该是

$id = mysqli_real_escape_string($connection, $_POST['id']);

您主要以mysqli_函数处理事物(这是更好的方法),但在这种情况下,您使用mysql_连接进行转义。 不要使用它,它已被弃用,并且很快将不再起作用,因为它易受SQL注入攻击每种语法都有所不同。您已正确设置订单,但输入错误(因为其他所有内容都使用mysqli。此外请勿使用魔术引号!危险且已弃用

请注意,有更好的方法来处理查询,如果您使用预准备语句,则根本不需要转义它(也不需要担心您的变量是否需要引用)。这些都是安全的(有些人会这么说,所以你不需要记住来逃避所有变量),并且有更大的查询速度更快的优势。

例如,见下文。以下是使用delete语句的示例:

首先使用面向对象的样式连接到数据库,如下所示:

$connection = new mysqli("localhost", "user", "password", "database");

(请注意,最好将数据库变量存储在单独的脚本中,然后将其称为require_once include)

然后,像这样处理您的查询

$sql = $connection->prepare("DELETE FROM joke WHERE id=?");
$sql->bind_param("i", $id);
$sql->execute();
$sql->close();

请注意"i"指定这是一个整数(大多数是ids),但是如果这个变量是一个字符串,你可以调用它指定为"s"

有关mysqli预先准备好的陈述的更多信息,请查看此处:mysqli prepared statements

答案 1 :(得分:0)

您正在使用mysqli查询数据库,因此您需要使用mysqli_real_escape_string()而不是mysql_real_escape_string(),并删除已传递给函数$connection的第一个参数。这是每个开发人员犯下的一个非常常见的错误。

因此您可以用

替换第81行
$id = mysqli_real_escape_string($_POST['id']);

答案 2 :(得分:0)

类似的情况: 请参阅:www.westwoodpavillion / ecommerce / admin_area / login.php(源代码)

include("includes/db.php"); 

    if(isset($_POST['login'])){

        $email = mysqli_real_escape_string($con, $_POST['email']);

        $pass = mysqli_real_escape_string($con, $_POST['password']);

它对我有用.... eloisa ..非常感谢你。

答案 3 :(得分:-1)

变化:

if (!ini_get("safe_mode")) $success = mail($to, $subject, $message, $headers, $params);

为:

if (!ini_get("safe_mode")) $success = @mail($to, $subject, $message, $headers, $params);
  

像魔术一样工作..只需更改你的邮件($改为......而其余的改为   如上所述)