0

我知道mysql_已被弃用,但我只是将其用作从书中学习的工具。

我正在尝试了解占位符,当我单击“添加记录”时出现以下错误:

INSERT failed: EXECUTE statement USING @first,@last,@email,@user 
Unknown prepared statement handler (statement) given to EXECUTE

使用以下代码:

if (isset($_POST['first']) && isset($_POST['last']) && isset($_POST['user_name']) && isset($_POST['email']))
{
    $first      = get_post('first');
    $last       = get_post('last');
    $email      = get_post('email');
    $user_name      = get_post('user_name');

    // begin placeholde code
    $query = 'PREPARE statement FROM "INSERT INTO user_master VALUES(?,?,?,?)"';
    mysql_query($query);

    $query = 'SET @first = "$first",' . 'SET @last = "$last",' . 'SET @email = "$email",' . 'SET @user_name = "$user_name",';
    mysql_query($query);

    $query = 'EXECUTE statement USING @first,@last,@email,@user';
    mysql_query;

    // end placeholder code

    if(!mysql_query($query, $db_server)) echo "INSERT failed: $query <br />" . mysql_error() . "<br /><br />";
}


echo <<<END
<form action = "willingLog.html" method="post"><fieldset><legend>Sign Up:</legend>    <pre>
    First       <input type="text" name="first" />
    Last        <input type="text" name="last" />
    Email       <input type="text" name="email" />
    Username    <input type="text" name="user_name" />
                <input type="submit" value="AD RECORD" />
</pre></fieldset></form>
END;

// also from placeholder code
$query = 'DEALLOCATE PREPARE statement';
mysql_query($query);
// end placeholder code
4

3 回答 3

1

您的代码有 2 个错误。

  1. 您试图在一次调用 mysql_query 时运行多个查询,而您必须分别运行它们中的每一个
  2. 您正在使用的内联准备好的语句对于防止 sql 注入是无用的,因为您正在以通常的方式创建 SQL 查询,直接添加数据。所以,你必须像往常一样格式化它,使准备好的语句变得毫无用处。

因此,如果 Scarlett O'Hara 或 Bobby Tables 决定加入您的网站 - 您就有麻烦了。

所以。

  • 仅使用内联准备好的语句在控制台中使用它们
  • 如果您想使用 PHP 应用程序中的本地准备好的语句 - 使用 PDO。
  • 始终正确格式化您的查询,即

    $last = mysql_real_escape_string($_POST['last']);
    

    如果您要将其作为字符串插入到查询中

于 2013-03-12T06:58:06.507 回答
1

我认为您的初始PREPARE statement查询可能失败,您还应该更改行:

$query = 'SET @first = "$first",' . 'SET @last = "$last",' . 'SET @email = "$email",' . 'SET @user_name = "$user_name",';

$query = 'SET @first = "$first",' . ' @last = "$last",' . ' @email = "$email",' . ' @user_name = "$user_name",';

SETisSET variable_assignment [, variable_assignment] ...但您使用的语法SET variable_assignment [, SET variable_assignment] ...会导致错误。

要查看您的第一个查询是否有错误,请尝试以下操作:

$query = 'PREPARE statement FROM "INSERT INTO user_master VALUES(?,?,?,?)"';
$res = mysql_query($query);
if (!$res) die(mysql_error());
于 2012-06-26T20:48:56.620 回答
0

我认为你有一个简单的打字错误

$query = 'EXECUTE statement USING @first,@last,@email,@user';

mysql_查询;

您忘记将查询传递给 mysql_query 函数的地方,因此将其更改为

$query = 'EXECUTE statement USING @first,@last,@email,@user';
mysql_query($query);

希望它有效

于 2015-08-02T10:26:27.750 回答