有点新的mysql和php
我的网站上的每个页面都有一个点击计数器,还有一个列出所有页面和点击的私人页面。 我有一个按钮,将所有页面重置为零,并在每个页面列表旁边我有一个重置按钮,将单独重置每个页面。这一切都是使用文本文件,但现在我正在使用mysql数据库。我已将“重置所有”按钮编码为工作但无法使单个页面按钮起作用。
处理代码是:
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>";
答案 0 :(得分:0)
让我们从第一件事开始:
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();