沉默小子g
沉默小子g
2991 8 0

tagpage.php的问题

遇到一个问题,自己尝试了好多次都不知道为何会这样,我描述一下问题,@ego008 帮忙分析一下问题所在吧
点击论坛的"功能"标签,进入XXX.sinaapp.com/tag/功能 页面
这时页面显示

数据库出错:
MySQL Query Error
Mysql error description: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 
Mysql error number: 1064 
Date: 2013-05-20 @ 11:12 
Script: http://XXX.sinaapp.com/tag/%E5%8A%9F%E8%83%BD 

注:论坛数据库里面已经有“功能”这个标签了
如果我进入XXX.sinaapp.com/tag/功能测试 页面
注:数据库里没有“功能测试”这个标签
返回的就是404页面

然后我看了一下代码,在/tagpage.php里有

// 获取tag数据
$tag_obj = $MMC->get('tag_'.$tag);
if(!$tag_obj){
    $tag_obj = $DBS->fetch_one_array("SELECT * FROM `yunbbs_tags` WHERE `name`='".$tag."'");

    if(empty($tag_obj) || $tag_obj['ids']=== ''){
        header("HTTP/1.0 404 Not Found");
        header("Status: 404 Not Found");
        include(dirname(__FILE__) . '/403.html');
        exit;
    }else{
        $MMC->set('tag_'.$tag, $tag_obj, 0,300);
    }
}

也就是说,当标签不存在时select语句可以正确执行,当标签存在时select语句却执行失败
我又试着直接在SAE后台的PHPMyAdmin里直接执行SQL语句:
SELECT * FROM yunbbs_tags WHERE name='功能'
可以正确执行并显示
------------------------------分割线------------------------------
刚突然想到有可能是后面的SQL语句执行出错
然后看了一下在tagpage.php里还有下面代码:

// 获取文章列表
if($tag_obj['articles']){
    if($page == 0) $page = 1;
    $from_i = $options['list_shownum']*($page-1);
    $to_i = $from_i + $options['list_shownum'];

    if($tag_obj['articles'] > 1){
        $id_arr = array_slice( explode(',', $tag_obj['ids']), $from_i, $to_i);
    }else{
        $id_arr = array($tag_obj['ids']);
    }
    $ids = implode(',', $id_arr);
    //exit($ids);
    $query_sql = "SELECT a.id,a.uid,a.cid,a.ruid,a.title,a.addtime,a.edittime,a.comments,c.name as cname,u.avatar as uavatar,u.name as author,ru.name as rauthor
        FROM `yunbbs_articles` a
        LEFT JOIN `yunbbs_categories` c ON c.id=a.cid
        LEFT JOIN `yunbbs_users` u ON a.uid=u.id
        LEFT JOIN `yunbbs_users` ru ON a.ruid=ru.id
        WHERE a.id in(".$ids.")";

    $query = $DBS->query($query_sql);

然后我尝试在PHPMyAdmin里直接执行SQL语句:

SELECT a.id,a.uid,a.cid,a.ruid,a.title,a.addtime,a.edittime,a.comments,c.name as cname,u.avatar as uavatar,u.name as author,ru.name as rauthor
        FROM `yunbbs_articles` a
        LEFT JOIN `yunbbs_categories` c ON c.id=a.cid
        LEFT JOIN `yunbbs_users` u ON a.uid=u.id
        LEFT JOIN `yunbbs_users` ru ON a.ruid=ru.id
        WHERE a.id in("2")

可以正常显示id为2的文章的信息,所以有陷入僵局了
不过我感觉就是后面这句SQL语句的问题,但就是找不到原因

0

See Also

Nearby


Discussion (8)

沉默小子g
沉默小子g 2013-05-20 03:46

我试着执行

SELECT a.id,a.uid,a.cid,a.ruid,a.title,a.addtime,a.edittime,a.comments,c.name as cname,u.avatar as uavatar,u.name as author,ru.name as rauthor
FROM `yunbbs_articles` a
LEFT JOIN `yunbbs_categories` c ON c.id=a.cid
LEFT JOIN `yunbbs_users` u ON a.uid=u.id
LEFT JOIN `yunbbs_users` ru ON a.ruid=ru.id
WHERE a.id in("1,2")

可是只显示出id为1的文章信息,并没有显示2的信息,会不会是这块儿的问题?

0
沉默小子g
沉默小子g 2013-05-20 03:59

可是即使是in("1,2")这样也没有报错呀

0
ego008
ego008 2013-05-20 07:14

是SQL syntax,可能是浏览器里的那串百分号字符引起,估计与浏览器或编码有关,尝试在浏览器地址栏直接输入中文或在实行sql前把tag 还原(为中文)。

另,用 in(1,2) 代替 in('1,2') 看看

if(empty($tag_obj) || $tag_obj['ids']=== '')
这个语句应该是当标签不存在或存在但记录帖子的id 字段ids为空时实行。

0
ego008
ego008 2013-05-20 07:24

@沉默小子g 刚才在苹果里用safari 打开 https://www.youbbs.org/tag/%E5%8A%9F%E8%83%BD 时会自动转向 https://www.youbbs.org/tag/功能

0
沉默小子g
沉默小子g 2013-05-20 08:08

@ego008 应该不是编码问题。因为那串字符就是“功能”
且直接输入xxx.sinaapp.com/tag/功能 也报相同的错误。
所以现在问题很诡异。
PS:我修改过一些数据库的表,但这两个SQL语句所需要的我都没有改过

0
沉默小子g
沉默小子g 2013-05-20 15:38

@ego008 我想看看后面那句SQL语句执行前$ids里面存储的内容,所以在$ids = implode(',', $id_arr);后面添加
$testqueue = "INSERT INTO yunbbs_settings VALUES('temptemp', '.$ids.');"
$query = $DBS->query($testqueue);
可是再次进入xxx.sinaapp.com/tag/功能 页面,这次直接报500错误(服务器错误)
网站在检索 http://xxx.sinaapp.com/tag/%E8%A7%86%E9%A2%91 时遇到错误。 该网站可能关闭进行维护或配置不正确。
请问怎样改才可以正确的在yunbbs_settings表里存储ids的值呢?

0
ego008
ego008 2013-05-20 15:58

@沉默小子g
看Sae后台log

有些调似可直接echo 后 exit

0
沉默小子g
沉默小子g 2013-05-21 01:47

@ego008 刚才发现是我之前修改的一处导致了这个bug

0
Login Topics