在php和mysql中使用占位符以防止注入

在php和mysql中使用占位符以防止注入,php,mysql,prepared-statement,Php,Mysql,Prepared Statement,我知道mysql已经被弃用了,但我只是把它当作一个从书中学习的工具 我正在尝试了解占位符,单击“添加记录”时出现以下错误: 使用以下代码: if (isset($_POST['first']) && isset($_POST['last']) && isset($_POST['user_name']) && isset($_POST['email'])) { $first = get_post('first'); $las

我知道mysql已经被弃用了,但我只是把它当作一个从书中学习的工具

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

使用以下代码:

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
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');
//开始placeholde代码
$query='从“插入到用户主值(?,,,?)”中准备语句';
mysql\u查询($query);
$query='SET@first=“$first”、'.'SET@last=“$last”、'.'SET@email=“$email”、'.'SET@user\u name=“$user\u name”、';
mysql\u查询($query);
$query='使用@first、@last、@email、@user'执行语句;
mysql\u查询;
//结束占位符代码
如果(!mysql_query($query,$db_server))回显“插入失败:$query
”。mysql_error(); }
echo我认为您最初的
PREPARE语句
查询可能失败,您还应该更改行:

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

SET
的语法是
SET variable\u assignment[,variable\u assignment]…
但您使用的是
SET variable\u assignment[,SET variable\u assignment]…
,这会导致错误

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

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

您的代码有两个错误

  • 您试图在一次调用mysql\u query中运行多个查询,但必须分别运行每个查询
  • 您正在使用的内联准备语句对于防止sql注入是无用的,因为您正在以通常的方式创建sql查询,直接添加数据。所以,你必须像往常一样格式化它,使事先准备好的陈述毫无用处 所以,如果斯佳丽·奥哈拉或博比·泰尔斯决定加入你的网站,你就有麻烦了

    所以

    • 仅在控制台中使用内联准备语句
    • 如果您想使用PHP应用程序中本机准备的语句,请使用PDO
    • 始终正确设置查询格式,即

      $query = 'EXECUTE statement USING @first,@last,@email,@user';
      
      如果要将其作为字符串插入查询中


    我想您的电脑上有一个简单的打字错误

    $query = 'EXECUTE statement USING @first,@last,@email,@user';
    mysql_query($query);
    
    mysql\u查询

    您忘记将查询传递给mysql\u查询函数,因此将其更改为


    希望它能工作

    欢迎使用堆栈溢出!请不要对新代码使用
    mysql.*
    函数。它们不再得到维护,社区已开始恢复。看到了吗?相反,你应该学习并使用或。如果你不能决定,将帮助你做出选择。如果你想学习,这能回答你的问题吗?
    $last = mysql_real_escape_string($_POST['last']);
    
    $query = 'EXECUTE statement USING @first,@last,@email,@user';
    
    $query = 'EXECUTE statement USING @first,@last,@email,@user';
    mysql_query($query);