我想将我的文章数据库(articles)重新进行分类,我在文章数据库里新建了一个字段名‘directory’,值为‘0’。
另外,我做了一个辅助的分类目录表(TAG1)。category | tag1    | tag2   | tag3       | tag4    |  tag5   
art      | paint   | picture| sculpture  | photo   |  bronze
tourism  | tourism | travel | tour       | journey |  trip
fashion  | style   | vogue  | fashion    | mode    |  Popular
... 
工作思路是,把所有的文章从数据库里调出,先将文章里的文字拆成若干个单词,放进辅助的分类目录表里进行文字匹配(TAG1-TAG5)。如果文章中的文字和辅助的分类目录表里(TAG1-TAG5)的条件匹配,则输出目录名,UPDATE进文章数据库;没有时跳过。UPDATE条件是:每篇文章不可以重复分类,仅允许归有一个类别。每个类别只能出现5篇文章。
即:测试先从category=‘art’开始,满5条文章后,终止art的归类,剩余的文章进行category=‘tourism’依次类推。下面是我的代码,但是有3个mysql_query动作,当UPDATE写在mysql_fetch_array循环里时,limit失效,求助大家,如何解决这个问题?谢谢了。
<?php
header('Content-type:text/html; charset=utf-8');
$db = mysql_connect("localhost","root","root") or die("can not connect Mysql Server");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT content,id,directory,date FROM articles WHERE Order By date DESC");//从文章数据库里获得所有的文章。
while ($row = mysql_fetch_array($result))
{
$id = $row['id'];
$content = $row['content'];
$words = preg_split("/\s+/",$content); 
$uniqueWords = array_keys(array_flip($words)); //将没条文章分割成一个一个单词
$parts = '';
foreach($uniqueWords as $word){     
$parts[] = " tag1 = '$word' OR tag2 = '$word' OR tag3 = '$word' OR tag4 = '$word' OR tag5 = '$word' "; 
}  
$where = implode(" OR ", $parts);
mysql_select_db("mydb",$db);
mysql_query("SET NAMES utf8");
$query = mysql_query("SELECT * FROM tags1 WHERE ($where) AND category='art' "); // 把上面分割的单词放进TAG1表中,进行检索,如果文章中有文字和tag1表列中相吻合,输出category='art',如果没有,跳过不输出。
$citn = '';
            while ($row = mysql_fetch_array($query)) {
        $citn = $row['category'];
        } 
    $catnew = $citn;
mysql_query("UPDATE articles SET directory = '".$catnew."' WHERE id = '".$id."' AND directory ='0'  Order By date DESC LIMIT 5"); // 根据ID号匹配,UPDATE文章数据表,这里我试验时用了60篇文章,但是输完后查询数据库,却有11条文章的directory升级成了 'art'
}
mysql_close($db);
?>

解决方案 »

  1.   

    mysql_query("UPDATE articles SET directory = '".$catnew."' WHERE id = '".$id."' AND directory ='0'  Order By date DESC LIMIT 5");这句 ,不管任何时候,它只会更新一条, Order By date DESC LIMIT 5  根本没什么用
      

  2.   

    你是先查询文章,while循环是一条语句一条语句的执行, 你在循环中update文章去限制归类是没用的
      

  3.   

    是啊,那如何限制只插入5条呢?有没有其他办法?比如利用SESSION什么的?
      

  4.   

    <?php
    header('Content-type:text/html; charset=utf-8');
    $db = mysql_connect("localhost","root","root") or die("can not connect Mysql Server");
    mysql_select_db("mydb",$db);
    $result = mysql_query("SELECT content,id,directory,date FROM articles WHERE Order By date DESC");//从文章数据库里获得所有的文章。// 统计一个分类中的最大文章个数
    $count = 0;// 记录更新文章的id
    $ids = array();
    // 分类的总数量
    $categories = array('art', 'tourism', 'fashion');// 当前分类
    $curCategory = array_shift($categories);while ($row = mysql_fetch_array($result))
    {
    $id = $row['id'];
    $content = $row['content'];
    $words = preg_split("/\s+/",$content); 
    $uniqueWords = array_keys(array_flip($words)); //将没条文章分割成一个一个单词
    $parts = '';
    foreach($uniqueWords as $word){     
    $parts[] = " tag1 = '$word' OR tag2 = '$word' OR tag3 = '$word' OR tag4 = '$word' OR tag5 = '$word' "; 
    }

    $where = implode(" OR ", $parts);
    mysql_select_db("mydb",$db);
    mysql_query("SET NAMES utf8"); // 仅仅验证的话,就count吧
    $query = mysql_query("SELECT count(*) as count FROM tags1 WHERE ($where) AND category='$curCategory' "); // 把上面分割的单词放进TAG1表中,进行检索,如果文章中有文字和tag1表列中相吻合,输出category='art',如果没有,跳过不输出。

    // 不建议用while, 仅仅是返回是否有还是没有
    $count = 0;
    while ($row = mysql_fetch_array($query)) {
    $count = $row['count'];
    }  // 说明找到了分类
    if($count) {
    //记录分类
    $ids[] = $row['id'];
    $count++; // 高潮部分
    if($count == 5) {
    // 进行更新
    mysql_query("UPDATE articles SET directory = '".$curCategory."' WHERE id in ('".implode("', '", $ids)."')"); // 获取下一个分类
    if(!$curCategory = array_shift($categories)) {
    // 没有分类结束
    break;
    } // 重新计数
    $count = 0; // 记录更新文章的id
    $ids = array();
    }
    }
    $catnew = $citn;
    mysql_query("UPDATE articles SET directory = '".$catnew."' WHERE id = '".$id."' AND directory ='0'  Order By date DESC LIMIT 5"); // 根据ID号匹配,UPDATE文章数据表,这里我试验时用了60篇文章,但是输完后查询数据库,却有11条文章的directory升级成了 'art'
    }
    mysql_close($db);
    ?>
    未经验证,仅做参考
      

  5.   

    <?php
    header('Content-type:text/html; charset=utf-8');
    $db = mysql_connect("localhost","root","root") or die("can not connect Mysql Server");
    mysql_select_db("mydb",$db);
    $result = mysql_query("SELECT content,id,directory,date FROM articles WHERE Order By date DESC");//从文章数据库里获得所有的文章。// 统计一个分类中的最大文章个数
    $count = 0;// 记录更新文章的id
    $ids = array();
    // 分类的总数量
    $categories = array('art', 'tourism', 'fashion');// 当前分类
    $curCategory = array_shift($categories);while ($row = mysql_fetch_array($result))
    {
    $id = $row['id'];
    $content = $row['content'];
    $words = preg_split("/\s+/",$content); 
    $uniqueWords = array_keys(array_flip($words)); //将没条文章分割成一个一个单词
    $parts = '';
    foreach($uniqueWords as $word){     
    $parts[] = " tag1 = '$word' OR tag2 = '$word' OR tag3 = '$word' OR tag4 = '$word' OR tag5 = '$word' "; 
    }

    $where = implode(" OR ", $parts);
    mysql_select_db("mydb",$db);
    mysql_query("SET NAMES utf8"); // 仅仅验证的话,就count吧
    $query = mysql_query("SELECT count(*) as count FROM tags1 WHERE ($where) AND category='$curCategory' "); // 把上面分割的单词放进TAG1表中,进行检索,如果文章中有文字和tag1表列中相吻合,输出category='art',如果没有,跳过不输出。

    // 不建议用while, 仅仅是返回是否有还是没有
    $count = 0;
    while ($row = mysql_fetch_array($query)) {
    $count = $row['count'];
    }  // 说明找到了分类
    if($count) {
    //记录分类
    $ids[] = $row['id'];
    $count++; // 高潮部分
    if($count == 5) {
    // 进行更新
    mysql_query("UPDATE articles SET directory = '".$curCategory."' WHERE id in ('".implode("', '", $ids)."')"); // 获取下一个分类
    if(!$curCategory = array_shift($categories)) {
    // 没有分类结束
    break;
    } // 重新计数
    $count = 0; // 记录更新文章的id
    $ids = array();
    }
    }
    // 这两句不要了
    //$catnew = $citn;
    //mysql_query("UPDATE articles SET directory = '".$catnew."' WHERE id = '".$id."' AND directory ='0'  Order By date DESC LIMIT 5"); // 根据ID号匹配,UPDATE文章数据表,这里我试验时用了60篇文章,但是输完后查询数据库,却有11条文章的directory升级成了 'art'
    }
    mysql_close($db);
    ?>
    后面2句可以不要了!
      

  6.   

    非常感谢hnxxwyq,帮忙写了那么多代码。
    不过还是没有插入成功。
    我把
    $query = mysql_query("SELECT count(*) as count FROM tags1 WHERE ($where) AND category='$curCategory' ");
    里的$curCategory,改成art,然后
    while ($row = mysql_fetch_array($query)) {
            $count = $row['count'];
            echo $count;//输出 00100000111000011000000000000010000000000100010110001000000
        } 
    用category='$curCategory' ,输出全部都变成了0。帮忙再看下,问题在哪里?
      

  7.   

     // 晕了,这里重复使用$count变量,导致运行不成功, 这样改
     // 不建议用while, 仅仅是返回是否有还是没有
        $_count = 0;
        while ($row = mysql_fetch_array($query)) {
            $_count = $row['count'];
        }     // 说明找到了分类
        if($_count) {
            //记录分类, 这里还可以验证directory是否 ='0'才记录分类
            $ids[] = $row['id'];
            $count++;        // 高潮部分
            if($count == 5) {
                // 进行更新
                mysql_query("UPDATE articles SET directory = '".$curCategory."' WHERE id in ('".implode("', '", $ids)."')");            // 获取下一个分类
                if(!$curCategory = array_shift($categories)) {
                    // 没有分类结束
                    break;
                }            // 重新计数
                $count = 0;            // 记录更新文章的id
                $ids = array();
            }
        }另外$query = mysql_query("SELECT count(*) as count FROM tags1 WHERE ($where) AND category='$curCategory' ");可以打印一下sql语句,然后放到mysql中,执行以后看有什么提示"SELECT count(*) as count FROM tags1 WHERE ($where) AND category='$curCategory' "