Php 页面刷新时丢失语音标记
我用php和mysql构建了一个分类导航系统Php 页面刷新时丢失语音标记,php,mysql,Php,Mysql,我用php和mysql构建了一个分类导航系统 $query = "SELECT category_name, category_desc FROM categories"; $result = mysql_query($query, $dbc) or die (mysql_error($dbc)); while($row = mysql_fetch_array($result)) { $catname = $row["category_name"]; $catdesc = $row["cat
$query = "SELECT category_name, category_desc FROM categories";
$result = mysql_query($query, $dbc)
or die (mysql_error($dbc));
while($row = mysql_fetch_array($result)) {
$catname = $row["category_name"];
$catdesc = $row["category_desc"];
echo "<li><a href='getsubs.php?category=$catname'>$catname<br /><span>$catdesc</span></a></li>";
$query=“从类别中选择类别名称、类别描述”;
$result=mysql\u查询($query,$dbc)
或者死亡(mysql_错误($dbc));
while($row=mysql\u fetch\u数组($result)){
$catname=$row[“类别名称”];
$catdesc=$row[“category_desc”];
回声“”;
这段代码为我提供了数据库中的类别列表
单击这些类别并请求getsubs.php文件时:
$category= $_GET['category'];
$query = "SELECT subcategory_name FROM subcategories WHERE subcategory_parent = '$category'";
$result = mysql_query($query, $dbc)
or die (mysql_error($dbc));
while($row = mysql_fetch_array($result)) {
$subcatname = $row["subcategory_name"];
echo "<li><a href='getsubsubs.php?category=$subcatname'>$subcatname</a></li>";
$category = mysql_real_escape_string($_GET['category']);
}
$category=$\u GET['category'];
$query=“从子类别中选择子类别\u名称,其中子类别\u父项='$category';
$result=mysql\u查询($query,$dbc)
或者死亡(mysql_错误($dbc));
while($row=mysql\u fetch\u数组($result)){
$subcatname=$row[“subcategory_name”];
回声“”;
$category=mysql\u real\u escape\u字符串($\u GET['category']);
}
页面其余部分的文本(不是数据库驱动的)丢失了基本级别上的任何语音标记/引号(“)。有人知道为什么会这样吗
非常感谢
编辑:之前和之后:
那些
?
经常因为unicode编码问题而出现。您的表子类别
和类别
可能有不同的排序规则。一个可能是unicode变体,另一个选项较少。请尝试以下快速修复方法:
-- in the top query:
SELECT
category_name COLLATE latin1_swedish_ci,
category_desc COLLATE latin1_swedish_ci
FROM categories
-- in the bottom query
SELECT subcategory_name COLLATE latin1_swedish_ci
FROM subcategories WHERE subcategory_parent = '$category'"
更正确的方法是将两个表更改为使用相同的排序规则和/或使用
标记调整编码输出。(类似
的方法可能会这样做)
(顺便说一句,我或多或少必须指出,您应该在DB输入周围使用
mysql\u real\u escape\u string
)问题与我的字符编码无关,经过检查,字符编码都是正确的。问题是我一直在使用一种不同类型的引号,但我仍然无法在键盘上找到它
Quote type 1=“(这是导致问题的原因)Quote type 2=“(这可以在mac上的右shift键上方找到) 文本是从另一个包含这些奇怪引号的文件中复制和粘贴的。 如果有人知道这个替代标记来自何处,那么将来知道它将是有用的
非常感谢您的所有输入人员。什么是“语音标记”?引号(“)?同样,您的代码很容易受到SQL注入攻击……在执行查询后,为什么要在循环中转义类别值?是的,一个引号(一直称为语音标记)。是的。甚至只是
$category=mysql\u real\u escape\u string($_GET['category'])
。转义的全部目的是防止用户提供的数据破坏您的查询。必须在数据到达数据库之前完成。有关详细信息,请参阅details@Richard:这是一个字符集不匹配的问题。类似于数据库提供UTF-8数据,而您的页面呈现为ISO-8859,反之亦然,这取决于它是如何呈现的,将进入数据库。您需要确保以一致的字符集收集、存储、检索和显示数据,并使用正确的字符集呈现页面。听起来您的数据库中存储了两种不同的引号编码。谢谢您的回答。我会的与其使用任何快速修复方法,不如第一次就把它弄对,但知道我能做到这一点非常好。谢谢。我将考虑更改两个表的排序规则:0)@理查德:如果你还没有读到,我也会读乔尔·斯波尔斯基的。@马特·吉布森:太棒了。我几周前读到了,还没来得及读。哈哈。这会教我的!第二类是“打字机”的引用;第一类是“真正的”引号,一种开放的“卷发”引号。如果要在Mac电脑上从内存中键入一个引号,请使用方括号键和Alt+[和Shift+Alt+[。对于单引号,请使用与]键相同的技巧。有关可能需要的更多信息,请参阅。没有理由使用“卷曲”如果您使用UTF8,引号应该会引起问题,例如,正如您所看到的,堆栈溢出可以很好地处理它们。@马特·吉布森谢谢马特!所有内容都设置为UTF8,但我仍然无法使用真正的引号。所有表中的所有列都设置为UTF8\U unicode\U ci,然后我的元数据如下所示: