0

对 mysql 和 php 有点陌生

我的网站上的每个页面都有一个点击计数器和一个列出所有页面和点击的私人页面。我有一个按钮,可以将所有页面重置为零,在每个页面列表旁边我有一个重置按钮,可以单独重置每个页面。这一切都在使用文本文件,但现在我正在切换到 mysql 数据库。我已经编写了“RESET ALL”按钮来工作,但无法让各个页面按钮工作。

处理代码为:

    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>";
4

1 回答 1

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();
于 2013-04-02T20:49:45.340 回答