在php和mysql中使用占位符以防止注入
我知道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
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);