- 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/
我最近开始经常做的一件事是在任务开始时检索一些数据并将其存储在 $_SESSION['myDataForTheTask'] 中。 现在这样做似乎很方便,但我对使用这种方法的性能、安全风险或类似情况一无
我注意到人们经常简单地写 我一直在使用: 有人可以解释检查变量是否设置时的区别吗(这就是我要使用它的目的)? 最佳答案 在 PHP 中,如果变量不存在(“未设置”),则 PHP 将吐出一个 E_
我一直被这个问题逼疯了。 我正在动态创建一个 session ID,以便在刷新时保留页面状态。 如果单击了一个页面元素,我会获取该元素的 ID 并将其传递给创建 session 变量的服务器端脚本:
我试过这样做: {{ $_GET['page'] }} 但还是不行。 最佳答案 对于 $_POST 变量使用这个: {{ app.request.parameter.get("page") }} 对于
你好, 我在拼凑一个简单的登录系统时遇到了一些问题。它在 Firefox 和 Chrome 中完美运行,但对于我来说,我似乎无法在 Windows 8 的 IE10 中结束 session 。 这是我
我有一个登录表单,以 session 电子邮件开头。现在,由于我希望能够通过表单更新电子邮件地址,而不破坏 session ,因此我需要将 session 更改为 ID。问题是它不会向我发送 id 值
我想存储一些信息,例如用户名、国家/地区名称等,并且需要在整个 session 期间可用。 实现这一目标的最佳方式是什么? 我有以下代码到 $_session 变量但没有结果。 page1.php
目前,我通过将 session 中的 key 与 MySQl 数据库中的相同 key 相匹配来验证用户 session 。我使用随机数重新生成 session ,该随机数在每个页面加载时都受 MD5
我遇到了这段代码的问题,我无法弄清楚问题出在哪里。所以当我运行这段代码时:if $row["count"] > 0 else块运行和 $_SESSION["error"]设置。 当$row["coun
我有一个关于 php $_SESSION 的问题。 假设我有一个用户 A 输入index.php,它输入了一些信息, $_SESSION['info'] = userA 现在用户B输入index.ph
我目前正在使用 onclick() 处理一张 table 将信息发送到 PHP 页面的元素。 基本思想是,如果单击一门类(class)(例如法语、数学、英语等),PHP 页面会检索该值,然后执行 SQ
我有条件地在给定页面上嵌入两个标题之一:“公司”或“学生和专业人士”。 我在登录时将用户类型(“”、“学生”或“专业”)存储在 $_SESSION 数组中,然后使用简单的 if 语句来确定要嵌入哪个
示例我有 100 个表单字段。每个字段都会有错误 session 。成功提交表单后,我想取消设置任何以 $_SESSION['submit_'] 开头的 session 首先我可以这样做 unset(
我正在处理一个项目,但 $_SESSION['username'] 没有回应 我使用了 var_dump,这就是我从该结果中得到的结果 我的问题是如何修复. array(4) { ["SES
我有条件地在给定页面上嵌入两个标题之一:“公司”或“学生和专业人士”。 我在登录时将用户类型(“”、“学生”或“专业”)存储在 $_SESSION 数组中,然后使用一个简单的 if 语句来确定要嵌入哪
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我正在为一家小公司开发一款供内部使用的简单应用。我很难让帐户登录正常工作,我相信这与 $_SESSION 没有像我预期的那样设置有关。现在我对 PHP 还很陌生,并且一直在学习。 index.php
我最近正在尝试解决一些关于 Session 的问题,现在我需要帮助才能使用 XAMPP 获得一个小页面。 我使用 4 个页面进行测试: 1) index.php是用户填写ID和PW的页面。 2) lo
我有两个单独的页面,一个页面是上传文件的地方,另一个页面显示信息。 在 imageupload.php 页面中,我在下面有这个 session : $_SESSION['fileImage']['na
我正在尝试更新数据库中的表。这是我到目前为止的代码: $query = "UPDATE user SET name='$name', pword='$pword', email='$email', a
我是一名优秀的程序员,十分优秀!