使用php重置mysql数据库中字段的html按钮
mysql和php有点新 我的网站上的每个页面都有一个点击计数器,还有一个列出所有页面和点击的私人页面。 我有一个将所有页面重置为零的按钮,在每个页面列表旁边,我有一个将分别重置每个页面的重置按钮。这一切都是使用一个文本文件,但现在我切换到mysql数据库。我已将“全部重置”按钮编码为工作,但无法使单个页面按钮工作 处理代码为:使用php重置mysql数据库中字段的html按钮,php,mysql,Php,Mysql,mysql和php有点新 我的网站上的每个页面都有一个点击计数器,还有一个列出所有页面和点击的私人页面。 我有一个将所有页面重置为零的按钮,在每个页面列表旁边,我有一个将分别重置每个页面的重置按钮。这一切都是使用一个文本文件,但现在我切换到mysql数据库。我已将“全部重置”按钮编码为工作,但无法使单个页面按钮工作 处理代码为: if($_POST[ind_reset]) { $ind_reset = $_POST[ind_reset]; mysql_connect("server",
if($_POST[ind_reset]) {
$ind_reset = $_POST[ind_reset];
mysql_connect("server", "username", "password") or die(mysql_error());
mysql_select_db("database") or die(mysql_error());
$sql = 'UPDATE counters SET Hits =\'0\' WHERE Page = \'$ind_reset\';';
}
html表单代码是一个字符串:
$page_reset = "<form id='Reset' action='counter_update.php' method='post'>
<button type='submit' name='ind_reset' value='$formPage'>RESET</button>
</form>";
$page\u reset=”
重置
";
让我们从第一件事开始:
if($_POST[ind_reset]) {
应该是
if($_POST['ind_reset']) {
它在没有引号的情况下工作,因为PHP正在默默地纠正您的错误。如果您将错误报告功能转到E_ALL,您将看到错误消息
你需要考虑的一件事是,你永远不能相信邮政数据是你认为应该是的。也许你输入了一个拼写错误。可能是黑客给你发送了伪造的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());
我希望您已经注意到,我将“die”替换为“error\u log”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();
在你创造一个如此巨大的破坏你的一天之前,请仔细阅读。您必须转义放入查询中的任何和所有用户提供的值,否则您将遇到麻烦…乍一看,此代码会产生类似$u POST[ind\u reset]的问题。可能是“ind_重置”吗?谢谢您的快速响应!我阅读了SQL转义,并将代码更改为您在下面看到的内容。然而,我不确定我是否完全理解它!$stmt=$db->prepare('UPDATE counters SET Hits='0',其中Page=\'$ind\u reset\'';$stmt->bind_参数('si',$ind_reset);$stmt->execute();谢谢你的快速回复!塔德曼和维兹维!!维兹维,为什么会有问题?非常感谢spscèU技术公司的解释。我总是愿意知道我做错了什么,而不是让别人纠正它!非常感谢!!尚未尝试过,但很快就会尝试。只是为了澄清,这里没有用户输入,只有我和按钮的值/名称,但很好地了解未来!我很快就会回来的!在尝试了一些更改之后,唯一有效的就是您的mysqli代码。我仍在研究这个问题,以找出原因,但问题解决了!再次感谢!你感谢我接受了我的回答,所以我得到了声誉分数。:)我强烈建议在学习过程中打开E_ALL error reporting,以便看到所有错误,然后在完成后关闭它。。。。我只是记得mysql不能用分号,所以这是一个失败的原因。答案被接受,我会投票,但没有足够的代表。如果其他人可以投票,请做,很好的回答和解释。