Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用php重置mysql数据库中字段的html按钮_Php_Mysql - Fatal编程技术网

使用php重置mysql数据库中字段的html按钮

使用php重置mysql数据库中字段的html按钮,php,mysql,Php,Mysql,mysql和php有点新 我的网站上的每个页面都有一个点击计数器,还有一个列出所有页面和点击的私人页面。 我有一个将所有页面重置为零的按钮,在每个页面列表旁边,我有一个将分别重置每个页面的重置按钮。这一切都是使用一个文本文件,但现在我切换到mysql数据库。我已将“全部重置”按钮编码为工作,但无法使单个页面按钮工作 处理代码为: if($_POST[ind_reset]) { $ind_reset = $_POST[ind_reset]; mysql_connect("server",

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>";
$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不能用分号,所以这是一个失败的原因。答案被接受,我会投票,但没有足够的代表。如果其他人可以投票,请做,很好的回答和解释。