我的SQL Update脚本出现问题。 它打印“Motto Changed”但不更新行。根据许多教程,我的代码都是正确的。请帮忙
$sql="UPDATE loadout SET motto='".$_POST['motto']."' WHERE steamid='".$steamid."'";
再次更新:
<?php
require "../requires/php/steam.php";
$dbhost = '**';
$dbname = 'battlefield';
$dbuser = 'battlefield';
$dbpass = '**';
$con = mysql_connect($dbhost, $dbuser, $dbpass);
$authserver = bcsub( SteamID(), '76561197960265728' ) & 1;
$authid = ( bcsub( SteamID(), '76561197960265728' ) - $authserver ) / 2;
$steamid = mysql_real_escape_string("STEAM_0:$authserver:$authid");
$motto = mysql_real_escape_string($_POST['motto']);
mysql_select_db($dbname, $con);
$sql="UPDATE loadout SET motto='{$motto}' WHERE steamid='{$steamid}'";
if (!mysql_query($sql, $con))
{
die('Error: ' . mysql_error());
}
echo "Motto Changed";
if (!mysql_query($sql, $con))
{
die('Error: ' . mysql_error());
}
$n = mysql_affected_rows();
echo"Motto changed on {$n} row(s)";
mysql_close($con)
?>
答案 0 :(得分:0)
永远不要将$ _POST变量直接插入到SQL字符串中。您不能信任$ _POST变量,它们可能很容易包含修改SQL语法的字符,以及导致SQL注入漏洞的原因。
奇怪的是,您创建了一个转义版本为$motto
,然后您永远不会使用它(根据@Arth的评论)。
总是将您插入到SQL中的字符串转义为SQL,即使您认为它们是安全的。&#34;例如,$ steamid只包含您控制的文字文本,以及几个整数。这应该是安全的,但如果其他开发人员明年改变了Steamid的格式呢?如果你逃避它,你就不会出错。
$steamid = mysql_real_escape_string("STEAM_0:$authserver:$authid");
$motto = mysql_real_escape_string($_POST['motto']);
$sql="UPDATE loadout SET motto='{$motto}' WHERE steamid='{$steamid}'";
当然,最佳做法是使用查询参数。您正在使用PHP不推荐使用的mysql扩展,它不支持查询参数。但我明白,如果您还没有准备好重写大量代码来切换到PDO。如果是,请按照How can I prevent SQL-injection in PHP?
中的示例进行操作另一个问题:如果您想知道UPDATE是否影响了行,请不要认为它只是因为UPDATE没有返回错误。如果WHERE子句中的条件只与零行匹配,那么这不是错误。如果UPDATE匹配一行,它也不是错误,但座右铭已包含您尝试设置的字符串。
更新后,检查受影响的行数:
if (!mysql_query($sql, $con))
{
die('Error: ' . mysql_error());
}
$n = mysql_affected_rows();
echo "Motto changed on {$n} row(s)";