Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.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-在$\u会话数组中找不到现有字符串值_Php_Mysql - Fatal编程技术网

PHP-在$\u会话数组中找不到现有字符串值

PHP-在$\u会话数组中找不到现有字符串值,php,mysql,Php,Mysql,我以前问过这个问题,但没有得到回应,所以我删除了最后一个问题,简化/澄清了这个问题,并重新发布 我有一个漫画网站。。。我正在研究一个如此时尚的标签系统。用户可以选择一个或多个标签,这些标签将显示所有相关的漫画 为了记住用户选择,我将它们存储在$\u会话数组中 我遇到的问题是,在用户选择后存储在$\u会话['tagnames']数组中的字符串'business'在数组中找不到 它的工作方式应该是用户选择一个标记,然后取消选择它,他们再次单击它。。。所以我检查字符串是否在$\u会话中。。。如果是,

我以前问过这个问题,但没有得到回应,所以我删除了最后一个问题,简化/澄清了这个问题,并重新发布


我有一个漫画网站。。。我正在研究一个如此时尚的标签系统。用户可以选择一个或多个标签,这些标签将显示所有相关的漫画

为了记住用户选择,我将它们存储在$\u会话数组中

我遇到的问题是,在用户选择后存储在$\u会话['tagnames']数组中的字符串'business'在数组中找不到

它的工作方式应该是用户选择一个标记,然后取消选择它,他们再次单击它。。。所以我检查字符串是否在$\u会话中。。。如果是,取消设置它。。。以下是一个片段:

    //var_dump shows these are both set fine when a user clicks on the tag they want
    $tagid = (isset($_GET['tagid']) ? ($_GET['tagid']) : null); 
    $tagname = (isset($_GET['tagname']) ? ($_GET['tagname']) : null); 

    ...

//Tag IDS are added and removed without issue:
    //if tag id exists in $_SESSION['tags'] array, remove it 

    if ($key = array_search($tagid, $_SESSION['tagids'])) {
        unset($_SESSION['tagids'][$key]);
    }
    else {
        $_SESSION['tagids'][] = $tagid;
    }

    ...

//but one of the tag names, 'business', is not being removed... and is actually added again even when I press F5 to refresh

    if ($key =  array_search($tagname, $_SESSION['tagname'])) {
        unset($_SESSION['tagname'][$key]);
    }
    else {
        $_SESSION['tagname'][] = $tagname;
    }
这是sql语句的
var\u dump
:它正确地显示了根据选择的标记id更改的查询

这是会话['tagname']的
变量转储。。。您可以看到,它可以识别何时已经添加了标记2和3(差异和相似性)(我使用了
array\u search()
进行检查),但它没有找到标记ID 1“business”,即使它显然已经添加了好几次

以下是将所选标记名返回给用户的函数:

function getSelectedTags() {

 global $tagid, $tagname;

    if ($key =  array_search($tagname, $_SESSION['tagname'])) {
        unset($_SESSION['tagname'][$key]);
    }
    else {
        $_SESSION['tagname'][] = $tagname;
    }

    var_dump($_SESSION['tagname']);

    foreach ($_SESSION['tagname'] as $tagname) { 
        echo '<span class="tags">' . $tagname . '</span>';
    }
}
imageDisplay.php:负责处理如何过滤和显示图像

getDBTags()从数据库返回标记选项,以便用户可以单击它们:

function getDBTags() {
include 'dbconnect.php';

global $cat;

$sql = "SELECT tagid, tagname FROM tags";

$query = $mysqli->query($sql);

while ($row = $query->fetch_assoc()) {
    echo '<span class="tags"><a href=".?action=homepage&cat='.$cat.'&tagid='.$row['tagid'].'&tagname='.$row['tagname'].'">'.$row['tagname'].'</a></span>';
}
mysqli_close($mysqli);
}
函数getDBTags(){ 包括“dbconnect.php”; 全球$cat; $sql=“选择标记ID,标记名来自标记”; $query=$mysqli->query($sql); 而($row=$query->fetch\u assoc()){ 回声'; } mysqli_close($mysqli); }
getFilters()通过使用动态查询决定如何过滤图像,然后将查询发送到pagination(),pagination()在页面上显示过滤后的图像

function getFilters() {
include 'dbconnect.php';

global $cat, $site, $table, $tagid;

$order = " ORDER BY date DESC";

//if tag id exists in $_SESSION['tags'] array, remove it 
if ($key = array_search($tagid, $_SESSION['tagids'])) {
    unset($_SESSION['tagids'][$key]);
}
//if it doesn't, add it
else {
    $_SESSION['tagids'][] = $tagid;
}
//var_dump($_SESSION['tagids']);

if ($cat != null) $catquery = " AND catidFK = $cat";
else $catquery = null;

$sql = 
 "SELECT c.*, t.* 
 FROM comics c 
 INNER JOIN comictags ct ON (c.id = ct.comicID)
 INNER JOIN tags t ON (t.tagid = ct.tagID)
 WHERE ct.tagID IN ('" . implode(', ', $_SESSION['tagids']). "')
". $catquery ." " . $order;

if (!$mysqli->query($sql)) printf("<br /><b>Error:</b> %s\n", $mysqli->error); 

$query = $mysqli->query($sql);

var_dump($sql);
mysqli_close($mysqli);

return $query;
}
函数getFilters(){
包括“dbconnect.php”;
全局$cat、$site、$table、$tagid;
$order=“按日期描述的订单”;
//如果$\u会话['tags']数组中存在标记id,请将其删除
如果($key=array\u search($tagid,$\u SESSION['tagid'])){
取消设置($_会话['tagid'][$key]);
}
//如果没有,请添加它
否则{
$\会话['tagid'][]=$tagid;
}
//变量转储($_会话['tagid']);
如果($cat!=null)$catquery=“和catidFK=$cat”;
else$catquery=null;
$sql=
选择c.*,t.*
来自漫画
内部连接comictags ct打开(c.id=ct.comicID)
内部连接标记t ON(t.tagid=ct.tagid)
其中ct.tagID位于(“.”。内爆(“,”,$\u会话['tagID'])。“)
“$catquery。”“$order;
如果(!$mysqli->query($sql))printf(
错误:%s\n,$mysqli->错误); $query=$mysqli->query($sql); 变量转储($sql); mysqli_close($mysqli); 返回$query; }
getSelectedTags()将所选标记标题返回给用户,以便用户可以查看所选内容。如果他们再次单击标记(从上面的getDBTags()返回),它将从$\u会话['tagname']中删除该标记。这就是问题所在:

function getSelectedTags() {

global $tagid, $tagname;
if ($key =  array_search($tagname, $_SESSION['tagname'])) {
    unset($_SESSION['tagname'][$key]);
}
else {
    $_SESSION['tagname'][] = $tagname;
}
//var_dump($key =  array_search($tagname, $_SESSION['tagname']));
var_dump($_SESSION['tagname']);

foreach ($_SESSION['tagname'] as $tagname) { 
    echo '<span class="tags">' . $tagname . '</span>';
}

}
函数getSelectedTags(){ 全局$tagid,$tagname; 如果($key=array\u search($tagname,$\u SESSION['tagname'])){ 取消设置($\会话['tagname'][$key]); } 否则{ $\会话['tagname'][]=$tagname; } //变量转储($key=array\u search($tagname,$\u SESSION['tagname']); 变量转储($会话['tagname']); foreach($\会话['tagname']作为$tagname){ 回显“.$tagname.”; } }
有三个突出的问题(两个突出,一个非常微妙)

1.仅打开一个DB连接并将其保留: 首先,不要在函数中的
$mysqli
中打开和关闭连接,而是在脚本开始时执行一次并保持打开状态。您需要修改函数以接受
$mysqli
作为参数(首选)或通过
全局$mysqli访问它(非首选)。无需调用
mysqli\u close()
,因为这是隐式完成的

在您的
getFilters()
函数中,您实际上是在关闭MySQLi资源
$MySQLi
,然后尝试
返回$query其中,
$query
是一个结果资源。这样做会使结果资源变得无用

// Pass $mysqli as a parameter
function getFilters($mysqli) {
  //...
  // Do alll your stuff...
  // And do not call mysqli_close()!
  return $query
}
2.使用
array\u search()
FALSE
进行严格的比较和测试: 使用
array\u search()
时,如果您的结果是数组中键
[0]
处的第一个元素,则周围的
if()
条件会将其视为错误返回,而不是应为正的结果。因此,位置
[0]
处的标记将被重复添加而不是删除。这需要在几个地方修复

// First get the key, which is an int or FALSE
$key = array_search($tagid, $_SESSION['tagids']);
// Unset if it is FALSE by strict comparison
if ($key !== FALSE) { 
  unset($_SESSION['tagids'][$key]); 
} 
else {
   $_SESSION['tagids'][] = $tagid;
}
3.全局变量
$tagname
foreach
破坏: 您已经在
getSelectedTags()
中访问了全局
$tagname
。但在该函数中,有一个
foreach
循环,它执行以下操作:

foreach ($_SESSION['tagname'] as $tagname)
当使用
$tagname
作为循环变量时,它实际上会在每次迭代中覆盖全局
$tagname
。您需要将其更改为不同的值,或者无论何时调用
getSelectedTags()
$tagname
全局标记都将成为会话['tagname']
中的最后一个标记,毫无例外

// use a different varname in the loop
foreach ($_SESSION['tagname'] as $tn) {
  // Also calling htmlspecialchars to escape here. Do this in any variable to HTML output...
  echo '<span class="tags">' . htmlspecialchars($tn) . '</span>';
}
//在循环中使用不同的varname
foreach($\会话['tagname']作为$tn){
//也调用htmlspecialchars在这里转义。在HTML输出的任何变量中执行此操作。。。
echo.''htmlspecialchars($tn.'';
}

有三个突出的问题(两个突出,一个非常微妙)

1.仅打开一个DB连接并将其保留: 首先,不要在函数中的
$mysqli
中打开和关闭连接,而是在脚本开始时执行一次并保持打开状态。您需要修改函数以将
$mysqli
接受为
// use a different varname in the loop
foreach ($_SESSION['tagname'] as $tn) {
  // Also calling htmlspecialchars to escape here. Do this in any variable to HTML output...
  echo '<span class="tags">' . htmlspecialchars($tn) . '</span>';
}