嗨,我在这个网站上搜索了很多帮助,但搜索得越多,我就越困惑。
我有一个表格比赛,其中有字段ID(主键)玩家*团队名称*(一个团队中有3名玩家)和分数(玩家)
competition TeamCompetition
Player : TeamName : Score : TeamName : TeamScore
------ : -------- : ----- : ----------------------
Tom : team1 : 50 : team1 : 50+66+35=151
Brian : team1 : 66 : team2 : 54+85+...etc
Tim : team1 : 35 :
Calvin : team2 : 54 :
Jerry : team2 : 85 :
等等。
我已经设法在SQL中做了SUM,就像这样:
$result1 = mysql_query("SELECT SUM(Score) AS team1 FROM competition WHERE TeamName='team1' ");
我试图将变量$team1保存到名为TeamCompetition的新表中,其中一个团队的总和保存为一个带有团队名称的数字
$row1= mysql_fetch_array($result1);
$team1= $row1['team1'];
$sql1=("INSERT INTO TeamCompetition (TeamScore)
VALUES '$_POST[team1]'
WHERE TeamName='team1' ");
但这行不通,有人能建议我如何处理这段代码吗?或者还有其他更优雅的方法来解决它吗?如果我在没有$sql1的情况下回显它,它会显示结果,为什么我不能保存它。。。?
SQL语法问题的基本解决方案是:
$sql1=("INSERT INTO TeamCompetition (TeamScore, TeamName)
VALUES ('".$_POST[team1]."','team1'");
由于数据库中当前没有包含teamname的行,您应该创建它。此外,请注意$_POST是一个数组,在评估的脚本中处理不好。
然而,我想你会在得到分数时更新这个:
$sql1=("UPDATE TeamCompetition set TeamScore = '".$_POST[team1]."'
WHERE TeamName = 'team1'");
但是MySQL中有一个巧妙的技巧,INSERT。。。。关于复制密钥更新功能:
$sql1=("INSERT INTO TeamCompetition (TeamScore, TeamName)
VALUES ('$_POST[team1]','team1'
ON DUPLICATE KEY UPDATE TeamScore = '".$_POST[team1]."'" );
然而,有一件事我不能忽略:这段代码散发着SQL注入的味道
- 要么使用PDO(通常是最佳解决方案)
- 和/或不使用任何来自不受信任或易于操作的来源的数据,而不进行验证和正确处理(更糟糕的解决方案,但总比什么都没有好)
对这段代码来说,最不费力的保护(只要这些函数仍然受支持,由令人敬畏的NullPointer指出)可以是使用mysql_real_eescape_string,但这整件事仍将被弃用,因此不应用于新的开发:
$sql1=("INSERT INTO TeamCompetition (TeamScore, TeamName)
VALUES ('".mysql_real_escape_string($_POST[team1])."','team1'
ON DUPLICATE KEY UPDATE TeamScore = '".$_POST[team1]."'" );
因此,如果你必须修补一个旧代码,它将保持这种状态,你可以决定使用它,,但只有在评估了使用PDO的可能性之后!如果使用PDO的可能性很小,那么这就是方法(由PHP PDO文档提供):
<?php
try {
//open connection, this is different than in the old functions
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
//***running query
//**step1: create statement
$stmt = $dbh->prepare("INSERT INTO TeamCompetition (TeamScore, TeamName)
VALUES (:teamScore,:teamName)
ON DUPLICATE KEY UPDATE TeamScore = :teamScore "); //notice parameters prefixed with ':'
//**step2: bind values
$stmt->bindValue(':teamScore', $_POST[team1]);
$stmt->bindValue(':teamName', 'team1');
//**step3: exexcute statement
$stmt->execute();
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>
你可以一蹴而就。根本不需要通过PHP传递信息。
INSERT INTO TeamCompetition (TeamName, TeamScore) VALUES (SELECT TeamName, SUM(Score) FROM competition GROUP BY TeamName)
您需要验证输入,并且您的代码可用于sql注入检查如何防止PHP中的sql注入
请不要在新代码中使用
mysql_*
函数。它们不再被维护,并被正式弃用。了解准备好的语句,并使用PDO或MySQLi