我有这个php代码,它有很多mysql_query
和or die ( mysql_error() )
我该如何减少mysqlquery,或者我的代码真的需要or die(mysql_error())吗?
我要把我的代码粘贴在这里。
$sqlScore = "UPDATE game SET currentTurn = '1', remainingTiles='".$remainingTiles."' WHERE gameID = '".$gameID."'";
mysql_query( $sqlScore ) or die ( mysql_error() );
$ScoreSelect = set_mysql( "SELECT * FROM game WHERE gameID = '".$gameID."'" );
$up_gameID = $ScoreSelect['gameID'];
$set_p1 = $ScoreSelect['player1'];
// CHECK IF GAMEID EXIST FOR SCORE
$checkData = mysql_query( "SELECT * FROM score WHERE gameID = '".$gameID."' " ) or die ( mysql_error() );
$rcd = mysql_fetch_array( $checkData );
$rcd['gameID'] == $gameID
? mysql_query( "UPDATE score SET score = '".$score."' WHERE gameID = '".$gameID."' " ) or die ( mysql_error() )
: mysql_query( "INSERT INTO score VALUE( '', '".$gameID."', '".$player1."', '".$score."')" ) or die ( mysql_error() );
// INSERT SQL WORD DATA
$sqlWD = mysql_query( "INSERT INTO word_data VALUE( '', '".$gameID."', '', '".$worddata."')" ) or die ( mysql_error() );
// CHECK FOR TILE
$sqlCheckRow = mysql_query( "SELECT * FROM wctilerack WHERE gameID = '".$up_gameID."' AND email = '".$up_email_player1."' " ) or die ( mysql_error() );
if ( mysql_num_rows( $sqlCheckRow ) == "1" ) {
// INSERT wctilerack
$sqlTileUP = mysql_query( "UPDATE wctilerack SET tiles = '$playerRack' WHERE gameID = '".$up_gameID."' AND email = '".$up_email_player1."' ") or die ( mysql_error() );
} else {
// INSERT wctilerack
$sqlTileINSERT = mysql_query( "INSERT INTO wctilerack VALUE('', '".$up_gameID."', '".$up_email_player1."', '$playerRack' ) ") or die ( mysql_error() );
}
// UPDATE lastPlayed
$sqlUpdatePlayed = mysql_query( "UPDATE user SET lastPlayed=NOW() WHERE email = '$up_email_player1' " ) or die ( mysql_error() );
// UPDATE word
$sqlUpdateWord = mysql_query( "UPDATE game SET lastWord = '".$xword[2]."', lastPoints='".$score."' WHERE gameID = '$up_gameID' " ) or die ( mysql_error() );
//$sqlInsertWord = mysql_query( "INSERT INTO word_data VALUE( '', '".$up_gameID."', '', '".$xword[2]."' )" ) or die ( mysql_error() );
/*$sqlCheckSK = mysql_query( "SELECT * FROM gameTileSkins WHERE gameID = '$gameID' AND email = '$up_email_player1' " ) or die ( mysql_error() );
if ( mysql_num_rows( $sqlCheckSK ) == '1' ) {
$skUP = mysql_query( "UPDATE gameTileSkins SET tileSkin='$tileSkinID' WHERE gameID = '$gameID' AND email = '$up_email_player1' " ) or die ( mysql_error() );
} else {
// INSERT gameTileSkins
$sqlSK = mysql_query( "INSERT INTO gameTileSkins VALUE('', '$gameID', '$up_email_player1', '$tileSkinID')" ) or die ( mysql_error() );
}*/
如果您注意到调用了很多查询。它是一个游戏应用程序,可以获取所有记录并进行更新。有没有一种方法可以清除代码。
首先:切换到PDO或MySQLi。不再推荐使用mysql函数。来自PHP手册:
不鼓励使用此扩展(mysql)。相反,MySQLi或应使用PDO_MySQL扩展。
在实际清理代码方面,您应该研究"不要重复自己"的概念。一个用于常见操作(连接、查询等)的包装类将帮助您清理一些东西。创建自己的包装器类是一种很好的学习方法,它将帮助您抽象大多数常见的数据库查询。
如果这段代码是有效的,并且经过多年的错误修复,您不应该尽可能少地更改它。我建议您对代码进行grep并查找"mysql_query"调用。并首先用类似的功能替换它。
mysql_query( some text here ) or die(mysql_error());
应该用代替
handle_query( some text here )
handle_query
函数应定义为
function handle_query($query){
mysql_query( $query) or die(mysql_error());
}
之后运行测试。如果一切顺利。更改handle_query
函数体。
我该如何减少mysqlquery,或者我的代码真的需要or die(mysql_error())吗?
你可以使用sed/grep。假设您的代码在junk_code.php
中,您可以使用此命令读取这些or die (mysql_error())
;
sed 's/mysql_query/handle_query/g' junk_code | sed 's/'s*or's*die's*('s*mysql_error('s*)'s*)'s*//g'
但在玩这种遗留代码之前,不要忘记备份。这些代码有多年的使用经验。可能会有很多错误修复。你肯定不想破坏它。
除非您想开始牺牲错误处理或减少正在使用的查询数量,否则不行。看看用更多的换行符清理代码库,或者转向MVC风格,将每个数据库查询有效地抽象为自己的函数。
// CHECK IF GAMEID EXIST FOR SCORE
$checkData = mysql_query( "SELECT * FROM score WHERE gameID = '".$gameID."' " ) or die ( mysql_error() );
$rcd = mysql_fetch_array( $checkData );
$rcd['gameID'] == $gameID
? mysql_query( "UPDATE score SET score = '".$score."' WHERE gameID = '".$gameID."' " ) or die ( mysql_error() )
: mysql_query( "INSERT INTO score VALUE( '', '".$gameID."', '".$player1."', '".$score."')" ) or die ( mysql_error() );
和
$sqlCheckRow = mysql_query( "SELECT * FROM wctilerack WHERE gameID = '".$up_gameID."' AND email = '".$up_email_player1."' " ) or die ( mysql_error() );
if ( mysql_num_rows( $sqlCheckRow ) == "1" ) {
// INSERT wctilerack
$sqlTileUP = mysql_query( "UPDATE wctilerack SET tiles = '$playerRack' WHERE gameID = '".$up_gameID."' AND email = '".$up_email_player1."' ") or die ( mysql_error() );
} else {
// INSERT wctilerack
$sqlTileINSERT = mysql_query( "INSERT INTO wctilerack VALUE('', '".$up_gameID."', '".$up_email_player1."', '$playerRack' ) ") or die ( mysql_error() );
}
您可以使用ON DUPLICATE KEY语法为(插入/更新)编写一个查询,而不用编写这些代码。
eg: mysql_query("INSERT INTO score VALUES ('', '".$gameID."', '".$player1."', '".$score."') ON DUPLICATE KEY UPDATE score = '".$score."'") or die ( mysql_error() );