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

tom*_*evs 0 php

嘿,我是一个PHP新手,在这里建立一个"fetch,post to db,allow delete"项目,我已经获取了数据,打印了数据库行,现在我正在添加删除每一行的功能,'$id'但我是遇到这个错误.

我突出显示81行的astricks以及上下两个注释块,以便您轻松找到它.

谢谢你帮我学习.

<?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();
}




?>
Run Code Online (Sandbox Code Playgroud)

nom*_*tic 5

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

$id = mysql_real_escape_string($connection, $_POST['id']);
Run Code Online (Sandbox Code Playgroud)

相反它应该是

$id = mysqli_real_escape_string($connection, $_POST['id']);
Run Code Online (Sandbox Code Playgroud)

你主要将事物作为mysqli_函数处理(这是更好的方法),但是在这种情况下,你是一个使用mysql_连接来逃脱. 不要使用它,它已被弃用,并且很快将不再起作用,因为它容易受到sql注入的影响.每种语法都有所不同.你有正确的订单设置,但有一个错字(因为其他一切都在使用mysqli.也不要使用魔术报价!危险和弃用

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

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

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

$connection = new mysqli("localhost", "user", "password", "database");
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

有关预准备语句的更多信息mysqli,请查看: mysqli准备语句