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