- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我之前问过这个问题,但是没有回复,所以我删除了最后一个问题,并简化/澄清了问题,然后重新发布
我有一个漫画网站...我正在开发一个 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 更改的查询。
这是 $_SESSION['tagname']
的 var_dump
...您可以看到它识别标签 2 和 3(不同点和相似点)何时已经存在已被添加(我使用 array_search()
进行检查),但它没有找到 tagid 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>';
}
}
有没有想过为什么标记名“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>';
}
}
最佳答案
有三个突出的问题(两个突出,一个非常微妙)。
首先,不要在函数的 $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
}
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;
}
$tagname
被 foreach
破坏了:您已经在 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/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!