Php mysql\u real\u escape\u string()希望参数1为字符串,对象为给定的

Php mysql\u real\u escape\u string()希望参数1为字符串,对象为给定的,php,Php,嘿,我是一个PHP新手,在这里设置了一个“fetch,post to db,allow delete”项目,我已经获取了数据,打印了db行,现在我添加了功能,通过'$id'删除每一行,但我遇到了这个错误 我用astricks突出显示了第81行以及上面和下面的两个注释块,以便您可以轻松找到它 谢谢你帮我学习 <?php // ***** MagicQuoteFix ***** // if (get_magic_quotes_gpc()) { function stripsla

嘿,我是一个PHP新手,在这里设置了一个“fetch,post to db,allow delete”项目,我已经获取了数据,打印了db行,现在我添加了功能,通过
'$id'
删除每一行,但我遇到了这个错误

我用astricks突出显示了第81行以及上面和下面的两个注释块,以便您可以轻松找到它

谢谢你帮我学习

<?php

// ***** MagicQuoteFix ***** //

if (get_magic_quotes_gpc())  
{  
  function stripslashes_deep($value)  
  {  
    $value = is_array($value) ?  
        array_map('stripslashes_deep', $value) :  
        stripslashes($value);  
    return $value;  
  }  
  $_POST = array_map('stripslashes_deep', $_POST);  
  $_GET = array_map('stripslashes_deep', $_GET);  
  $_COOKIE = array_map('stripslashes_deep', $_COOKIE);  
  $_REQUEST = array_map('stripslashes_deep', $_REQUEST);  
} 

// ***** Begin Connection Info ***** //

$connection = mysqli_connect('localhost', 'ijdbuser', 'ijdbpw');

if (!$connection)
{
    $error = 'Unable to connect to the database server.';
    include 'error.html.php';
    exit();
}

if (!mysqli_set_charset($connection, 'utf8'))
{
    $output = 'Unable to set database connection encoding.';
    include 'output.html.php';
    exit();
}

if (!mysqli_select_db($connection, 'ijdb'))
{
    $error = 'Unable to locate the joke database.';
    include 'error.html.php';
    exit();
}

// ***** Display DB ***** //

$result = mysqli_query($connection, 'SELECT id, joketext FROM joke');

if (!$result)
{
    $error = 'Error fetching jokes: ' . mysqli_error($connection);
    include 'error.html.php';
    exit();
}

while ($row = mysqli_fetch_array($result))
{
    $jokes[] = array('id' => $row['id'], 'text' => $row['joketext']);
}

if (isset($_GET['addjoke'])) {}

else
{
    include 'jokes.html.php';
}

// 


// ***** Begin Add/Remove DB Options ***** //

if (isset($_GET['addjoke']))
{
    include 'form.html.php';
    exit();
}

if (isset($_GET['deletejoke']))
{
// LINE 81 //
******81.****** $id = mysql_real_escape_string($connection, $_POST['id']);
// LINE 81 //

    $sql = "DELETE FROM joke WHERE id='$id'";
    if (!mysqli_query($connection, $sql))
    {
        $error = 'Error deleting joke: ' . mysqli_error($connection);
        include 'error.html.php';
        exit();
    }
    //header('Location: .');
    exit();

}

if (isset($_POST['joketext']))
{
    $joketext = mysql_real_escape_string($connection, $_POST['joketext']);

    $sql = 'INSERT INTO joke SET
        joketext="' . $_POST['joketext'] . '",
        jokedate=CURDATE()';

    if (!mysqli_query($connection, $sql))
    {
        $error = 'Error adding submitted joke: ' . mysqli_error($connection);
        include 'error.html.php';
        exit();
    }
    header('Location: .');
    exit();
}




?>

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

因此,可以将第81行替换为

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

您正在使用mysqli查询数据库,因此需要使用
mysqli\u real\u escape\u string()
而不是
mysql\u real\u escape\u string()
,并删除传递给函数的第一个参数,即
$connection
。这是每个开发人员都会犯的一个非常常见的错误

因此,可以将第81行替换为

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

您的问题在于这一行(有错误的那一行)

应该是这样

$id = mysqli_real_escape_string($connection, $_POST['id']);
您主要以
mysqli
函数的形式处理事情(这是更好的方式),但是在这种情况下,您使用的是
mysql
连接进行转义不要使用此选项,它已被弃用,并且很快将不再工作,因为它容易受到sql注入的攻击每个选项的语法都不同。您的顺序设置正确,但有一个输入错误(因为其他所有内容都在使用
mysqli
。另外不要使用魔法引号!危险且不推荐使用

注意,有更好的方法来处理查询,如果您使用预先准备好的语句,您根本不需要转义它(也不需要担心您的变量是否需要引用)。这些方法同样安全(有些人会说得更安全,因此您不必记着转义所有变量),并具有对较大查询速度更快的优势

例如,请参见下面。下面是使用delete语句的示例:

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

$connection = new mysqli("localhost", "user", "password", "database");
(注意,最好将数据库变量存储在单独的脚本中,然后将其称为
require\u once
include)

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

$sql = $connection->prepare("DELETE FROM joke WHERE id=?");
$sql->bind_param("i", $id);
$sql->execute();
$sql->close();
请注意,
“i”
指定这是一个整数(与大多数ID一样),但是如果此变量是字符串,则可以调用将其指定为
“s”


有关
mysqli
prepared语句的更多信息,请查看此处:

您的问题在于这一行(出现错误的那一行)

应该是这样

$id = mysqli_real_escape_string($connection, $_POST['id']);
您主要是以
mysqli\uu
函数的形式处理事情(哪种方式更好),但是在本例中,您使用的是一个用于转义的
mysql\uucode>连接。不要使用此连接,它已被弃用,并且很快将不再工作,因为它容易受到sql注入的攻击。每个连接的语法都不同。您已正确设置顺序,但有一个打字错误(因为其他所有东西都在使用
mysqli
。另外不要使用神奇的引号!危险的和不推荐的

注意,有更好的方法来处理查询,如果您使用预先准备好的语句,您根本不需要转义它(也不需要担心您的变量是否需要引用)。这些方法同样安全(有些人会说得更安全,因此您不必记着转义所有变量),并具有对较大查询速度更快的优势

例如,请参见下面。下面是使用delete语句的示例:

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

$connection = new mysqli("localhost", "user", "password", "database");
(注意,最好将数据库变量存储在单独的脚本中,然后将其称为
require\u once
include)

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

$sql = $connection->prepare("DELETE FROM joke WHERE id=?");
$sql->bind_param("i", $id);
$sql->execute();
$sql->close();
请注意,
“i”
指定这是一个整数(与大多数ID一样),但是如果此变量是字符串,则可以调用将其指定为
“s”

有关
mysqli
prepared语句的更多信息,请查看此处:

类似情况: 请参阅:www.westwoodpavilion/ecommerce/admin_area/login.php(源代码) 这对我很有用……埃洛伊萨……非常感谢。

类似情况: 请参阅:www.westwoodpavilion/ecommerce/admin_area/login.php(源代码) 这对我很有用……埃洛伊萨……非常感谢。

改变:

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

就像变魔术一样。只要把你的邮件($改成…,剩下的改成 (如上所述)

更改:

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

就像变魔术一样。只要把你的邮件($改成…,剩下的改成 (如上所述)


假设它是mysqli\u real\u escape\u string,为什么要混合使用
mysql\u
mysqli\u
函数?看起来你把错误的参数传递给了
mysql\u real\u escape\u string
,但是你应该使用这个函数的
mysqli
版本,或者更好的数据绑定。@AlexanderO'Mara是对的。我在这里在<代码> MySQL < /COD>和<代码> myqLII/COD>之间的语法略有不同,不只是<代码> i>代码>。请考虑<代码> mySqLI:/Cord>函数引用。我同意@ AlxyDoR'MARA。我强烈推荐查看mySQL编写的语句。这将有利于您在很多方面,如更好地保护S。QL注入。你一定是在开玩笑。我是新来的,但从我现在读到的评论来看,唯一的区别就是有不同的扩展?我发誓
mysql\u real\u escape
是为表单数据提交部分工作的。我不了解mysql