我无法在php中多次执行相同的功能

Posted

技术标签:

【中文标题】我无法在php中多次执行相同的功能【英文标题】:I'm unable to execute same function with multiple times in php 【发布时间】:2016-09-30 05:40:07 【问题描述】:

这是我的 login.php 代码

require_once 'connect.inc.php';
require_once 'core.inc.php';

if(isset($_POST['username']) && isset($_POST['password']))
    $username=$_POST['username'];
    $password=$_POST['password'];
    $password_hash=md5($password);
    if(!empty($username) && !empty($password))
        $query="SELECT `id` FROM `login` WHERE `username`='$username' AND `password`='$password_hash'";
        if($query_run = mysqli_query($stat,$query))
            $query_num_rows = mysqli_num_rows($query_run);
            if($query_num_rows == 0)
                echo 'You have entered wrong username or password !';
            
            else if($query_num_rows == 1)
                function mysqli_result($res, $row, $field) 
                    $res->data_seek($row); 
                    $datarow = $res->fetch_array(); 
                    return $datarow[$field]; 
                
                $user_id= mysqli_result($query_run, 0,'id');
                $_SESSION['user_id'] = $user_id;
                header('Location: index.php');
            
        
        else
        
            echo 'You have entered wrong username or password !';
        
    else 
        echo 'You must have to enter username and password';
    

<form action="<?php echo $server; ?>" method="POST">
    Username:
    <input type="text" placeholder="Enter the userid" name="username">
    Password:
    <input type="password" placeholder="Enter your password" name="password">    
    <input type="submit" value="Log in">

这里是 index.php 的代码

require_once 'core.inc.php';
require_once 'connect.inc.php';

if(get_status())
$firstname=getinfo('firstname');
$lastname=getinfo('lastname');
echo 'You are logged in ,'.$firstname.' '.$lastname.'';
echo "<br><a href='logout.php'>Logout</a><br>";

else 
 include_once 'login.php';

这里是 core.inc.php 的代码

session_start(); 
ob_start();
$server =$_SERVER['SCRIPT_NAME'];
@$ref_url=$_SERVER['HTTP_REFERER'];
function get_status()
    if(isset($_SESSION['user_id']) && !empty($_SESSION['user_id']))
        return true;
    
    else
        return false;  


function getinfo($field)
    $get_query="SELECT `$field` FROM `login` WHERE `id`='".$_SESSION['user_id']."'";
    require 'connect.inc.php';
    if($query_run=mysqli_query($stat,$get_query))
            function mysqli_result($res, $row, $f) 
            $res->data_seek($row); 
            $datarow = $res->fetch_array(); 
            return $datarow[$f]; 
        
        if($query_result=mysqli_result($query_run,0,$field))
            return $query_result;
        
    

当我使用$lastname=getinfo('lastname'); after using $firstname=getinfo('firstname'); 时,在上面的代码中(在 index.php 中)。它给了我以下错误。 <b>Fatal error:</b> <i>Cannot redeclare mysqli_result() (previously declared in C:\xampp\htdocs\good\core.inc.php:18) in C:\xampp\htdocs\good\core.inc.php on line 18</i>

请有人帮帮我。我是第一次学习这种语言。

【问题讨论】:

你应该学习参数化查询,php.net/manual/en/mysqli.quickstart.prepared-statements.php 【参考方案1】:

在函数getinfo 之外定义函数mysqli_result。然后从getinfo 调用它。

由于你已经在getinfo 中定义了该函数,所以mysqli_result 的函数定义将在第一次调用getinfo 时执行。当您第二次调用getinfo 时,mysqli_result 的函数定义将再次执行。但是它已经被定义了,你会得到那个错误。

【讨论】:

【参考方案2】:

我猜你有 javascript 开发背景。

但是在 php 中我们声明函数的方式不同。

所以例如你的 core.php 应该是这样的:

session_start(); 
ob_start();
$server =$_SERVER['SCRIPT_NAME'];
@$ref_url=$_SERVER['HTTP_REFERER'];
function get_status()
    if(isset($_SESSION['user_id']) && !empty($_SESSION['user_id']))
        return true;
    
    else
        return false;  


function mysqli_result($res, $row, $f) 
    $res->data_seek($row); 
    $datarow = $res->fetch_array(); 
    return is_array($datarow)?$datarow[$f]:false; 


function getinfo($field)
    $get_query="SELECT `$field` FROM `login` WHERE `id`='".$_SESSION['user_id']."'";
    require 'connect.inc.php';
    if($query_run=mysqli_query($stat,$get_query))
        if($query_result=mysqli_result($query_run,0,$field))
            return $query_result;
        
    

现在我们知道我们在core.php 中声明了mysqli_result 函数

所以如果任何 php 文件将 require_once 'core.inc.php'; 我们不需要重新声明这个函数。在index.php 的情况下,您调用include_once 'login.php';,在login.php 中,您试图重新声明mysqli_result,这是多余的。所以你的login.php 片段可以转换为:

 else if($query_num_rows == 1)
     $user_id= mysqli_result($query_run, 0,'id');
     $_SESSION['user_id'] = $user_id;
     header('Location: index.php');
 

我猜你只是 php 的初学者,其他开发人员可以提供一些其他建议。但我的回答只是关于你的问题,为什么你有错误 Cannot redeclare mysqli_result().

【讨论】:

【参考方案3】:

为了所有的好处,请使用 PDO

$query = "SELECT id FROM login WHERE username=? AND password=?";
$stmt  = $pdo->prepare($query);
$stmt->execute([$username, $password]);
$user_id = $stmt->fetchColumn();
if($user_id) 
    $_SESSION['user_id'] = $user_id;
    header('Location: index.php');
    exit;
 else 
    echo 'You have entered wrong username or password !';

这个。是。全部。 您需要的代码。这几行而不是你所拥有的所有可怕的混乱,试图重新动画一个死的 mysql_result 函数。

【讨论】:

以上是关于我无法在php中多次执行相同的功能的主要内容,如果未能解决你的问题,请参考以下文章

多次使用相同代码的最佳方式? /PHP [重复]

如何在 Oracle SQL Developer 中多次执行相同的存储过程?

如何在页面上多次嵌入相同的 redux-form?

SQL 多次返回相同的结果

NHibernate 多次执行相同的查询

对 glDrawElements 的多次调用是不是比在 GLSL 中对每个片段执行相同的计算更有效?