[PHP] Nested for each probleem

Pagina: 1
Acties:

  • BierPul
  • Registratie: Juni 2001
  • Laatst online: 29-08 23:13

BierPul

2 koffie graag

Topicstarter
Met de volgende code probleem ik meerer HTML files te indexeren naar de volgende db layout

tbl_files
file_id
file_path
file_kenmerk

tbl_keywords
keyword_id
keyword

tbl_files_keywords
file_id
keyword_id
match_count

In losse woorden heb ik een array met losse woorden die uit de text worden gesplitst met een spatie.

Tot dusver gaat alles ok

Nu loop ik met een foreach alle woorden langs en kijk of ze in de db staan etc etc.

Als ik de matches wil gaan uitvoeren lijkt er niets aan de hand te zijn maar ik krijg onwerkelijk hoge match_counts 381 bijv en dat constant naar mate we verder in de Files komen dese te lager de match count :(

Ik snap niet waardoor dat komt , iemand :?


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
                $losse_woorden = explode(" ",$inhoud);
                    foreach($losse_woorden as $woord) {
                                            if(strlen($woord) >= 4) {
                                                $woord = chop(addslashes($woord));
                                                #checken of het woord al in de db voorkomt
                                                $check_keyword = mysql_query("SELECT keyword_id FROM tbl_keywords WHERE keyword = '$woord'") or die (mysql_error());
                                                $count_keyword = mysql_num_rows($check_keyword);
                                                
                                                    
                                                    if($count_keyword < 1) {
                                                        /*Het woord staat er nog niet niet in dus posten*/
                                                        mysql_query("INSERT into tbl_keywords (keyword) values ('$woord')") or die (mysql_error());
                                                        $keyword_id = mysql_insert_id();
                                                    } else {
                                                        $array_keyword = mysql_fetch_row($check_keyword);
                                                        $keyword_id = $array_keyword[0];
                                                    }
                                                    
                                                    #keyword_id is gezet nu kijken of deze al vaker voorkomt
                                                            $file_keyword_match_qry = mysql_query("SELECT file_id FROM tbl_files_keywords WHERE keyword_id = '$keyword_id'") or die (mysql_error());
                                                            $count_file_keyw = mysql_num_rows($file_keyword_match_qry);
                                        
                                                            if($count_file_keyw > 0) {
                                                                $update_me = mysql_fetch_row($file_keyword_match_qry);
                                                                mysql_query("UPDATE tbl_files_keywords SET match_count = match_count+1 WHERE file_id = '{$update_me[0]}'");
                                                            } else {
                                                                mysql_query("INSERT into tbl_files_keywords (file_id, keyword_id, match_count) values ('$file_id', '$keyword_id',1)");
                                                            }
                                                }
                        }


* BierPul verontschuldigd zich voor zijn tabelverneukend gedrag :)

Ja man


  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 14-07 14:28

thomaske

» » » » » »

is dit geen ouderwets debug werkje?

dus na iedere regel even echo'en wat je precies aan het doen bent..?

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • BierPul
  • Registratie: Juni 2001
  • Laatst online: 29-08 23:13

BierPul

2 koffie graag

Topicstarter
|:(

briljante update query was de schuld :P

Ja man


  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 14-07 14:28

thomaske

» » » » » »

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Je hebt ook een query teveel....

Als keyword nog niet bestaat dan bestaat er ook geen koppeling met tbl_files_keywords dus daar hoef je dan ook niet op te testen.

Programmer - an organism that turns coffee into software.


  • BierPul
  • Registratie: Juni 2001
  • Laatst online: 29-08 23:13

BierPul

2 koffie graag

Topicstarter
Toch gaat het niet helemaal lekker

Ik plaats maar even de gehele code

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
set_time_limit(0);

mysql_query("DELETE FROM `tbl_files");
mysql_query("DELETE FROM `tbl_keywords");
mysql_query("DELETE FROM `tbl_files_keywords");

echo("leeg we gaan ervoor");

error_reporting(E_ALL);

require("INCLUDES/DBCONN.PHP");
require("FUNCTIONS/STRING_FUNCTIONS.PHP");

$root = "$DOCUMENT_ROOT/REMBRANDT/HTML_CONTENT";

function leesdir($root) {

    if ($map = @opendir($root)) {
        while (($bestand = readdir($map)) !== false) {
            if($bestand !== "." and $bestand !== "..") {
                $pad = $root . '/' . $bestand;  
                    if(is_dir( $pad )) { 
                        leesdir($pad);
                    } else {
                        #het is een bestand dus eerst checken op waardes en Classificeren
                        $extensie = substr($bestand, -4);
                            if($extensie == "HTML" or $extensie == ".HTM") {    
                            #tis een valide bestand dus openen...
                                if(preg_match("/_en./", $bestand)) { 
                                    $taal = "en"; 
                                } else { 
                                    $taal = "nl"; 
                                }
                                    $categorie = substr($bestand,0,1);
                                    mysql_query("INSERT into tbl_files (file_path, file_category, file_lang) values ('$pad', '$categorie', '$taal')");
                                    $file_id = mysql_insert_id();
                                    #gevens van het bestand staan in de db in tbl_files, nu bestand inlezen
                                    $text = file($pad);
                                    $ruw = $text[0];
                                    $inhoud = cleanupHTML($ruw);
                                    #HTML en rare dingen zijn verwijderd
                                    $losse_woorden = explode(" ",$inhoud);
                                
                                        foreach($losse_woorden as $woord) {
                                            if(strlen($woord) >= 4) {
                                                $woord = str_replace(",","",$woord);
                                                $woord = str_replace(" ","",$woord);
                                                $woord = str_replace(".","",$woord);
                                                $woord = str_replace(";","",$woord);
                                                $woord = str_replace(":","",$woord);
                                                $woord = str_replace("\"","",$woord);
                                                $woord = str_replace("'","",$woord);
                                                $woord = str_replace("?","",$woord);
                                                $woord = str_replace("!","",$woord);
                                                $woord = chop(addslashes($woord));
                                                #checken of het woord al in de db voorkomt
                                                $check_keyword = mysql_query("SELECT keyword_id FROM tbl_keywords WHERE keyword = '$woord'") or die (mysql_error());
                                                $count_keyword = mysql_num_rows($check_keyword);
                                                
                                                    
                                                    if($count_keyword < 1) {
                                                        /*Het woord staat er nog niet niet in dus posten*/
                                                        mysql_query("INSERT into tbl_keywords (keyword) values ('$woord')") or die (mysql_error());
                                                        $keyword_id = mysql_insert_id();
                                                    } else {
                                                        $array_keyword = mysql_fetch_row($check_keyword);
                                                        $keyword_id = $array_keyword[0];
                                                    }
                                                    
                                                    #keyword_id is gezet nu kijken of deze al vaker voorkomt
                                                            $file_keyword_match_qry = mysql_query("SELECT file_id FROM tbl_files_keywords WHERE keyword_id = '$keyword_id'") or die (mysql_error());
                                                            $count_file_keyw = mysql_num_rows($file_keyword_match_qry);
                                        
                                                            if($count_file_keyw > 0) {
                                                                $update_me = mysql_fetch_row($file_keyword_match_qry);
                                                                mysql_query("UPDATE tbl_files_keywords SET match_count = match_count+1 WHERE file_id = '$update_me[0]' AND keyword_id = '$keyword_id'") or die(mysql_error());
                                                                echo("gotcha");
                                                            } else {
                                                                mysql_query("INSERT into tbl_files_keywords (file_id, keyword_id, match_count) values ('$file_id', '$keyword_id',1)");
                                                            }
                                                }
                                        }                        
                            }
                    }   
            }
        }
    }
} 

leesdir($root);


Opmerking van Lucard nog niet verwerkt maar leek me voor deze vraag niet relevant

Hij geeft bij sommige woorden gewoon een match count van 20 aan tewrijl als ik ga kijken hij echt maar 2 keer voorkomt in dat bestand.

Ik ben aan het echoen geweest maar kan de fout niet xichtbaar repoproduceren :(

Ja man


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

mysql_query("DELETE FROM `tbl_files");
mysql_query("DELETE FROM `tbl_keywords");
mysql_query("DELETE FROM `tbl_files_keywords");

ik mis een `
Opmerking van Lucard nog niet verwerkt maar leek me voor deze vraag niet relevant
Dacht dat het opgelost was... en het viel me toevallig op...

Programmer - an organism that turns coffee into software.


  • BierPul
  • Registratie: Juni 2001
  • Laatst online: 29-08 23:13

BierPul

2 koffie graag

Topicstarter
Toch is het raar dat hij soms meer match_counts geeft dan hoort :(

Hier snap ik niets van |:(

Ja man


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

twee dingen...

• Misschien worden de tabellen niet gewist waardoor er telkens bij de vorige waarde woord op geteld. Dat kan hele rare waardes geven.

• Misschien moet je het tellen niet door de database laten doen maar lekker zelf doen.
Je kan een associative array aanmaken, en elke keer als je het woord tegen komt met 1 ophogen....

in halve php :)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
foreach($lossewoord as $woord) {
  $woord_teller[$woord]++;
}

// daarna alle woorden in db.

foreach($woord_teller as $k => $v) {

// INSERT OF DOE NIKS in tbl_keywords

// INSERT in tbl_file_keywords

}


• Je controleert of je woorden minimaal 4 chars heeft een daarna filter je nog wat extra ongewenste chars eruit... Misschien moet je eerst filteren en daarna controleren (Dit heeft niks met jouw huidige probleem te maken)

Programmer - an organism that turns coffee into software.


  • BierPul
  • Registratie: Juni 2001
  • Laatst online: 29-08 23:13

BierPul

2 koffie graag

Topicstarter
Ik heb het al gevonden

Ik ging zoeken in alle files of het keyword al een keer voorkwam terwijl ik een file specifiek behandel.

Dus hij ging voor alle files bij die ene file tellen |:(

Ja man

Pagina: 1