-1

包含的 php 文件:

    <?php
     session_start();

     $mysqli = new mysqli('[removed]', '[removed]', '[removed]', '[removed]') or mysqli_connect_error();

     function m($str, $mysqli) { return "'".$mysqli->real_escape_string($str)."'"; }
     function h($str, $mysqli) { echo $mysqli->htmlspecialchars($str); }

     $user = $mysqli->real_escape_string($_SESSION['username']);

     $user_query = "SELECT points FROM users WHERE username =" .m($user, $mysqli) ."";
     $result = $mysqli->query($user_query);
     $row = $result->fetch_assoc();
     $points = $row['points'];

     function checklogin(){
        if(isset($_SESSION['username'])){
        echo $user . " Points: " . $points; 
        }
      }
    ?>

html相关部分将是

<? include ('config.php')
   session_start(); 
   checklogin(); ?>

注意:在函数外部调用时,这些变量可以正常工作。

4

4 回答 4

5

如果您想根据最佳实践执行此操作,则以下内容比使用全局变量更好。

    function checklogin($user,$points)
    {
        if(isset($_SESSION['username'])){
            echo $user . ' Points: ' . $points;
        }
    }
于 2012-10-27T23:06:52.670 回答
1

这些变量是全局的,所以你不能指望那些在checkLogin函数内部。因此,您将值作为函数参数传递:

function checklogin($user, $points, $session) {

    if (!isset($session['username'])) return;

    echo $user, " Points: ",  $points; 
  }

用法:

<?php
include 'config.php';
checklogin($user, $points, $_SESSION);

从技术上讲,您不需要$_SESSION作为参数传递,我们在示例中这样做,以便稍后可以替换它并且函数不需要有$_SESSION变量。

于 2012-10-27T23:03:05.343 回答
1

PHP 全局变量只存在于全局范围内。要从函数中访问它们,您必须将全局范围带入函数中。请参阅以下链接:

http://php.net/manual/en/language.variables.scope.php

于 2012-10-27T23:03:23.043 回答
1

您的代码中有多个错误:

  • 如果您包含该文件,您有session_start()两次会导致警告
  • 您正在尝试访问不在函数范围内的变量,这会导致通知
  • 您正在使用短的开放标签 ( <?),这是不好的做法。
  • 您没有完全启用错误报告,否则您会看到错误/通知。

这些是真正错误的事情。

现在进行一些一般性改进:

  • 给你的函数起更好的名字(m()而且h()名字很烂,因为不清楚它们在做什么)。你的硬盘上有足够的空间,所以不需要多余的字母。如果在接下来的日子里你可能不记得它是 m、h、z 还是 p,你会为此感谢自己。
  • 查看准备好的语句和绑定的参数,这样您就不必再转义这些值了。
  • config.php似乎与配置内容无关。

一些可帮助您解决这些问题的一般参考资料:

于 2012-10-27T23:18:24.070 回答