让我们从第一件事开始:
if($_POST[ind_reset]) {
应该
if($_POST['ind_reset']) {
它不带引号也能工作,因为 PHP 正在默默地纠正您的错误。如果您将错误报告设置为 E_ALL,您将看到错误消息。
您需要考虑的一件事是,您永远不能相信 POST 数据是您认为的应有的数据。也许你输入了一个错字。也许黑客正在向您发送虚假的 POST 数据。无论是哪一种,如果在数据库更新中放入了错误的东西,它都会弄乱你的代码。出于这个原因,您应该有一个检查器来确保该值是有效的,而不是简单地将那个 POST 值插入到您的数据库中。当我做这样的事情时,我会创建一个可能值的数组,并在更新或插入数据库时只使用这些值。例子:
$pages = array('value_on_page'=>'value_put_in_database',
'xyz'=>'thing_in_database_2');
//the valid things to post are either 'value_on_page' or 'xyz',
//but what goes into the database are the values those keys point to
//e.g. if $_POST['ind_reset'] == 'xyz', $ind_reset will be 'thing_in_database_2'
$key = $_POST['ind_reset'];
if(!isset($pages[$key])) {
//if that posted value isn't a key in the array, it's bad
error_log('Invalid posted page'.$key);
} else {
//this is a valid posted page
$ind_reset = $pages[$key];
//** do the database stuff right here in this spot **//
}
现在,由于您发布的代码不起作用,您错过了执行数据库查询的最后一个关键部分:您实际运行查询的部分。
$conn = mysql_connect("server", "username", "password") or error_log(mysql_error());
mysql_select_db("database") or error_log(mysql_error());
$sql = 'UPDATE counters SET Hits =\'0\' WHERE Page = \'$ind_reset\';';
mysql_query($sql, $conn) or error_log(mysql_error());
我希望你注意到我用“error_log”替换了“die”。如果您执行 error_log(mysql_error(), 1, 'youremail@example.com'),它会通过电子邮件将其发送给您。否则,就像在我的示例中一样,它会被放入系统错误日志文件所在的任何位置。然后,您可以对数据库错误有一个很好的历史记录,这样当您不可避免地带着更多问题返回 StackOverflow 时,您可以准确地告诉我们发生了什么。如果您使用文件,只需确保轮换错误日志文件的名称(我根据当天的日期命名)或定期清除它,否则它会变得非常非常长。
使用您在评论中发布的 mysqli 代码比 mysql_* 函数更好,但您并不完全正确。“bind_param”部分将您的变量粘贴到问号所在的位置。如果你的变量是一个字符串,你把“s”放在第一位,或者如果它是一个整数,你把“i”放在第一位,等等。确保你在完成后关闭它们。
$db = new mysqli("server", "username", "password", "database");
if(!$db->connect_errno) {
$stmt = $db->prepare("UPDATE counters SET Hits = '0' where Page = ?");
$stmt->bind_param('s',$ind_reset); //assuming $ind_reset is a string
if(!$stmt->execute()) {
error_log($stmt->error);
}
$stmt->close();
} else {
error_log($db->connect_error);
}
$db->close();