声明为全局变量的PHP变量在函数内不起作用

问题描述:

我正在使用HTTP查询字符串来传递一个id。我将它分配给的变量完全适用于紧随其后的查询。然而,它并不在我在同一个文件中定义的任何函数中工作,尽管我将变量声明为全局函数。声明为全局变量的PHP变量在函数内不起作用

$circleID = $_GET['id']; 

$circleID很适合这个查询:

// Retrieve circle data 
$circleDataResult = mysqli_query($connection," SELECT  name, description 
               FROM  circle 
               WHERE  circleID = '$circleID' "); 

$circleData = mysqli_fetch_array($circleDataResult); 
$circleName = $circleData['name']; 
$circleDesc = $circleData['description']; 

它没有下面的函数内的工作,虽然。 $circleID似乎在这种情况下是空的:

if(isset($_POST['action']) && !empty($_POST['action'])) { 
    $action = $_POST['action']; 
    switch($action) { 
     case 'removeUser' : removeUser(); break; 
     case 'makeAdmin' : makeAdmin(); break; 
     case 'revokeAdmin' : revokeAdmin(); break; 
     case 'makeOwner' : makeOwner(); break; 
    } 
} 

function removeUser(){ 
    global $connection; 
    global $circleID; 

    $thisUserID = $_POST['id']; 

    $removeUserFromCircle = " DELETE 
           FROM  circle_participants 
           WHERE  circleID = '$circleID' AND userID = '$thisUserID' "; 

    if (mysqli_query($connection, $removeUserFromCircle)) { 
     echo "You removed " . getName($thisUserID) . " from this circle"; 
    } else { 
     echo "Error deleting record: " . mysqli_error($connection); 
    } 
} 

道歉,如果这是一个很小的问题。我对PHP很陌生,花了相当多的时间来解决这个问题,但我被卡住了。

+0

你确定你选择了正确的桌子?这是什么形式? –

+0

你应该准备和绑定并使用'$ _GET ['id']'(这是一个超级全局):http://php.net/manual/en/mysqli-stmt.bind-param.php – AbraCadaver

+0

是的,如果我硬编码circleID值,查询起作用。 – waldbaum

明白为什么这是行不通的

假设你发送的GET请求一个页面

$a = $_GET['variable']; 
echo $a ; // this will echo the variable 
exit; 

现在你正在再次发布请求到该页面

$a=$_POST['variable']; 
echo $a; // will print data if there exist data in the given variable 
exit; 

现在,既然您想访问发布数据中的先前获取数据,则必须将会话中的数据保存到会话中,因为在接下来的请求中,来自先前请求的所有数据都将为lo ST

所以在页面

session_start() 
$circleid = $_GET['id']; 
$_SESSION['cirlceid'] = $circleid; 

的起点和删除功能

function removeUser(){ 
global $connection; 
$circleID = $_SESSION['circleid'] 

$thisUserID = $_POST['id']; 

$removeUserFromCircle = " DELETE 
          FROM  circle_participants 
          WHERE  circleID = '$circleID' AND userID = '$thisUserID' "; 

if (mysqli_query($connection, $removeUserFromCircle)) { 
    echo "You removed " . getName($thisUserID) . " from this circle"; 
} else { 
    echo "Error deleting record: " . mysqli_error($connection); 
} 

}

+0

我刚试过这个。不幸的是它仍然不起作用。我得到一个'Undefined index:id',然后在错误报告中有一个'Undefined variable:circleid'。但是,第一个查询仍然有效。 'echo $ circleName'给了我正确的名字。 – waldbaum

+0

@waldbaum粘贴精确的代码或使用jmp.sh分享它 – user3411846

+0

这是确切的代码:https://gist.github.com/waldbaum/20010f96bb0e39145b1f9b794f2ac725 – waldbaum

为了总结回答其他任何人遇到的问题:

这似乎是我想通过GET从HTTP查询str中检索的id值正如user3411846指出的那样,POST请求会覆盖/设置值为空。因此,当代码通过AJAX执行时,circleID被设置为null。 使用会话变量与if(isset){}一起解决了问题!

这是代码位,我改变:的

if(isset($_GET['id'])){ 
    $_SESSION['circleid'] = $_GET['id']; 
} 

代替:代替

function removeUser(){ 
    ... 
    $circleID = $_SESSION['circleid']; 
    ... 
} 

function removeUser(){ 
    ... 
    global $circleID; 
    ... 
} 

$circleID = $_GET['id']; 

和函数内