gpt4 book ai didi

PHP - 在 $_SESSION 数组中找不到现有的字符串值

转载 作者:行者123 更新时间:2023-11-29 00:34:07 25 4
gpt4 key购买 nike

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


我有一个漫画网站...我正在开发一个 SO 风格的标签系统。用户可以选择 1 个或多个标签来显示所有关联的漫画。

为了记住用户的选择,我将它们存储在 $_SESSION 数组中。

问题 我遇到的是,在用户选择后存储在 $_SESSION['tagnames'] 数组中的字符串之一“business”未找到在数组中...

它应该工作的方式是用户选择一个标签,然后取消选择,他们再次点击它......所以我检查字符串是否在 $_SESSION 中......如果是,取消设置它...... . 这是一个片段:

    //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_dump:它正确显示了根据选择的标签 ID 更改的查询。

enter image description here

这是 $_SESSION['tagname']var_dump...您可以看到它识别标签 2 和 3(不同点和相似点)何时已经存在已被添加(我使用 array_search() 进行检查),但它没有找到 tagid 1,'business',即使它显然被添加了几次。

enter image description here

下面是将所选标签名称返回给用户的函数:

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>';
}
}

有没有想过为什么标记名“business”是导致问题的唯一因素?

即使在我销毁 session 后,按 F5 刷新也会自动将标记名“business”放入 $_SESSION['tagname'] 数组。


编辑:更全面的代码:

Homepage.php:用户点击从 getDBTags() 返回的标签,将标签添加到 imageDisplay.php 上的 $_SESSION 数组

<h5>Tags</h5>
<?php echo getDBTags(); ?>
<br/>
<p>Your tags:</p>
<?php echo getSelectedTags(); ?>

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);
}

getFilters() 通过动态查询决定应如何过滤图像,然后将查询发送到 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;
}

getSelectedTags() 将选定的标签标题返回给用户,以便他们可以看到他们选择的内容。如果他们再次点击标签(从上面的 getDBTags() 返回),它将从 $_SESSION['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>';
}

}

最佳答案

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

1。只打开一个数据库连接并保留它:

首先,不要在函数的 $mysqli 中打开和关闭连接,而是在脚本的开头执行一次并保持打开状态。您需要修改函数以接受 $mysqli 作为参数(首选)或通过 global $mysqli; 访问它(不首选)。无需调用 mysqli_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_search()FALSE 进行严格比较和测试:

当使用 array_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。全局变量 $tagnameforeach 破坏了:

您已经在 getSelectedTags() 中访问了全局 $tagname。但是在该函数中,您有一个 foreach 循环,它执行以下操作:

foreach ($_SESSION['tagname'] as $tagname)

当使用 $tagname 作为循环变量时,它实际上是在每次迭代时覆盖全局 $tagname。您需要将其更改为不同的值,或者每当您调用 getSelectedTags() 时,$tagname 全局将成为 $_SESSION[' 中的最后一个标签tagname'] 无一异常(exception)。

// 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>';
}

关于PHP - 在 $_SESSION 数组中找不到现有的字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15126796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com