所以,我试图在防止注射的同时使用get方法。我正在尝试从数据库中获取数据并将其回显到页面。我认为我正在尝试使用下面的代码很明显,但我需要帮助使用正确的语法。
有人能告诉我使用mysqli从数据库获取数据的prepare语句的正确语法吗?
我看过这个网站似乎无法找到我正在寻找的东西和PHP网站我找不到最新的方法。感谢您的帮助。
<?php
$mysqli = new mysqli("", "", "", "");
if ($mysqli->connect_error) {
echo "Failed to connect to MySQL: (" . $mysqli->connect_error . ") " . $mysqli->connect_error;
}
$stmt = $mysqli->stmt_init();
if($stmt->prepare("SELECT 'name,name' FROM 'table' WHERE 'name, name' = ?,?")) {
}
if (!$stmt->bind_param('si', $_GET['name'], $_GET['name'])); {
echo "Binding parameters failed: (" . $stmt->error . ") " . $stmt->error;
}
if (!$stmt->execute()) {
echo "Execute failed: (" . $stmt->error . ") " . $stmt->error;
}
if (!$stmt->fetch()); {
echo "Binding parameters failed: (" . $stmt->error . ") " . $stmt->error;
}
$stmt->close();
?>
答案 0 :(得分:0)
为了防止sql注入,你应该首先连接到你的mysql数据库,之后你应该用mysql_real_escape_string()包围$ _GET,如下所示:
mysql_real_escape_string($_GET['name'])
或使用更新的功能
mysqli_real_escape_string($_GET['name'])
答案 1 :(得分:0)
你的sql错了:
if($stmt->prepare("SELECT 'name,name' FROM 'table' WHERE 'name, name' = ?,?")) {
必须是
if($stmt->prepare("SELECT name, name FROM table WHERE name=? AND name=? ")) {
加倍表达name
,我只是因为这个问题而使用。
以下更清楚:
if($stmt->prepare("SELECT astring, ainteger FROM table WHERE astring=? AND ainteger=? "))
{
if (!$stmt->bind_param('si', $_GET['astring'], $_GET['ainteger'])) {
花点时间仔细写下问题。如果使用两个变量,那么指定不同的,其他一切只是混淆。
更新:
bind_param()
if (isset($_GET['name']))
;
结尾,例如: if (!$stmt->bind_param('si', $_GET['name'], $_GET['name'])); {
无论if
获得true
还是false
,花括号都是无用的!
if (!$stmt->bind_param(...));
之后的以下代码将始终执行,因为命令已完成。
if (!$stmt->bind_param('si', $_GET['name'], $_GET['name'])); {
echo "Binding parameters failed: (" . $stmt->error . ") " . $stmt->error;
}
我发现这个错误花了很长时间。它很容易被忽视。
这就是您总是收到自己的错误消息的原因。
答案 2 :(得分:0)
如果您想保护所有GET输入,这是更好的解决方案:
function GET($name=NULL, $value=false)
{
$content=(!empty($_GET[$name]) ? trim($_GET[$name]) : (!empty($value) && !is_array($value) ? trim($value) : false));
if(is_numeric($content))
return preg_replace("@([^0-9])@Ui", "", $content);
else if(is_bool($content))
return ($content?true:false);
else if(is_float($content))
return preg_replace("@([^0-9\,\.\+\-])@Ui", "", $content);
else if(is_string($content))
{
if(filter_var ($content, FILTER_VALIDATE_URL))
return $content;
else if(filter_var ($content, FILTER_VALIDATE_EMAIL))
return $content;
else if(filter_var ($content, FILTER_VALIDATE_IP))
return $content;
else if(filter_var ($content, FILTER_VALIDATE_FLOAT))
return $content;
else
return preg_replace("@([^a-zA-Z0-9\+\-\_\*\@\$\!\;\.\?\#\:\=\%\/\ ]+)@Ui", "", $content);
}
else false;
}
只需使用GET('something')$ _GET ['something'],如果GET值不存在,您可以选择设置默认值。在MySQL查询中,您可以使用转义字符串或准备好的状态来完全保护您的查询。