[OPGELOST] Column_name van FULLTEXT indexes weergeven

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Leon Kunst

Leon Kunst

11/12/2008 01:19:00
Quote Anchor link
Heren,

Het lijkt zo simpel, maar toch werk ik me er de hele avond al kapot op...

Het script:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?
foreach ($get_database_table_names_array as $tabelnamen)
{

    // Query opstellen per index
    $get_column_names_in_index_query = mysql_query("SHOW INDEX FROM ".$tabelnamen." FROM db WHERE Index_type = 'FULLTEXT'");
    while ($row = mysql_fetch_array($get_column_names_in_index_query, MYSQL_NUM))
    {

        print_r($row[4]);
    }
}

?>



Als ik de print_r hier neer pleur, dan krijg ik netjes alle juiste kolomnamen achterelkaar, van alle tabellen in database, waar een fulltext-index op zit. (ze worden tenslotte geëchod)

Probleem is het volgende.

Ik wil graag, buiten de while_lus een string hebben wat er zo uitziet:
$string = 'kolom1,kolom2,kolom3,kolom4,kolom5';

En wat ik ook probeer, ik krijg alleen maar array in array, of array met daarin steeds meer bij elkaar geplakte waarden etc.

Kunnen jullie me helpen, ik zie echt het echt ff niet meer...

Bedankt alvast.
Gewijzigd op 01/01/1970 01:00:00 door Leon Kunst
 
PHP hulp

PHP hulp

12/05/2024 07:26:34
 
Frank -

Frank -

11/12/2008 08:55:00
Quote Anchor link
Zet de resultaten eerst in een array en implode deze vervolgens tot de gewenste string:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$array
= array();
$string = '';

foreach ($get_database_table_names_array as $tabelnamen)
{

    // Query opstellen per index
    $get_column_names_in_index_query = mysql_query("SHOW INDEX FROM ".$tabelnamen." FROM db WHERE Index_type = 'FULLTEXT'");
    while ($row = mysql_fetch_array($get_column_names_in_index_query, MYSQL_NUM))
    {

        $array[] = $row[4];
    }
}

$string = implode(',', $array);
print_r($array);
echo $string;
?>


Ps. Je doet toch wel ergens iets aan foutafhandeling?

Pps. foutje!
Gewijzigd op 01/01/1970 01:00:00 door Frank -
 
Yorick17

yorick17

11/12/2008 08:57:00
Quote Anchor link
En als je die while er uit haalt en alleen een enkele array laat volproppen met data (om te testen)
 
Leon Kunst

Leon Kunst

11/12/2008 09:12:00
Quote Anchor link
@ pgFrank,

zoiets had ik al geprobeerd, alleen dan met de implode binnen de foreach, maar onder de while.

Alleen wat er dan gebeurd is dat alle waarden steeds verdubbelen en de nieuwe toegevoegd wordt in de array.

Opzich is de doelstelling simpel:

Ik heb een query, die een aantal rijen teruggeeft,
de waarden van die rijen wil ik achter elkaar in een string, gescheiden door een komma...
 
Frank -

Frank -

11/12/2008 09:17:00
Quote Anchor link
Leon Kunst schreef op 11.12.2008 09:12:
Ik heb een query, die een aantal rijen teruggeeft, de waarden van die rijen wil ik achter elkaar in een string, gescheiden door een komma...

Dat komt goed uit, mijn voorbeeldje doet dat ook.

Wat is het verschil tussen jouw verwachtingen en jouw resultaat? Laat dat eens zien.

En wie zegt dat de query goed gaat? Voer je niet tig keer dezelfde query uit waardoor je dubbele resultaten krijgt? Ik zie nergens enige controle, er kan dus heel erg veel fout gaan.

Edit: echo $string; toevoegen zou ook kunnen helpen... sorry!
Gewijzigd op 01/01/1970 01:00:00 door Frank -
 
Leon Kunst

Leon Kunst

11/12/2008 09:36:00
Quote Anchor link
@ pgFrank,

dit stukje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
foreach ($get_database_table_names_array as $tabelnamen)
?>

wordt gevuld met tabelnamen uit een query die er boven staat (niet relevant in dit geval)

Vervoglens voer ik dus voor elke betaande tabelnaam een query uit, die alleen de FULLTEXT indexes weergeeft horend bij de tabel.


in onderstaand stukje script (zelfde als bovenaan) zit inderdaad geen foutafhandeling. Maar je zult ook geen foutafhandeling zien, omdat de query wel goed is (los getest in 'n sql client)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?
foreach ($get_database_table_names_array as $tabelnamen)
{

    // Query opstellen per index
    $get_column_names_in_index_query = mysql_query("SHOW INDEX FROM ".$tabelnamen." FROM db WHERE Index_type = 'FULLTEXT'");
    while ($row = mysql_fetch_array($get_column_names_in_index_query, MYSQL_NUM))
    {

        print_r($row[4]);
    }
}

?>


Probleem alleen is, als je binnen de while lus een array maakt, en die vult met waarden, dan wordt door de foreach, elke keer de huidige waarde gebruikt, en de nieuwe waarde er achter geplakt (wat ik zo nog weet geloofk).

Dan krijg je iets als dit:

onderwerp
onderwerp+omschrijving
onderwerpomschrijving+uitgebreide_omschrijving
onderwerpomschrijvinguitgebreideomschrijving+cat

etc

ps; dit is trouwens de eerste query waarbij ik de foutafhandeling gwn vergeten ben, maar dat komt omdat ik flink aan het klooien was om er de goede output uit te krijgen)
 
Frank -

Frank -

11/12/2008 09:47:00
Quote Anchor link
Welke array met tabelnamen wil jij gaan uitvoeren en welk resultaat moet hier uitkomen?

Ik kan er geen touw aan vast knopen en heb al helemaal geen idee waarom je dit zou willen doen. Je bent toch niet PhpMyAdmin aan het nabouwen? Een DBA kan echt wel zonder zo'n scriptje achterhalen welke indexen er zijn en hoe deze zijn opgebouwd.
 
Leon Kunst

Leon Kunst

11/12/2008 11:38:00
Quote Anchor link
ik ben bezig met een geautomatiseerd systeem + ajax.

dit werkt allemaal al perfect, alleen moet ik nu eerst handmatig aangeven in welke tabellen en velden hij moet zoeken.

Ik wil dus, als ik indexes toevoeg aan bepaalde (nieuwe) tabellen, dat dit automatisch mee gezocht wordt mbv het zoeken systeem.

Echter moet niet in alle tabellen/kolommen gezocht worden. Alleen die instelt staan als zijnde FULLTEXT.
 
Frank -

Frank -

11/12/2008 11:43:00
Quote Anchor link
En hoe zien jouw queries eruit? Je kunt nog zoveel indexen aanmaken en uitsluitend op die kolommen zoeken waar een index op staat, er is geen enkele garantie dat MySQL de index ook gebruikt.

Ik lag gisteren nog te stoeien met een database die vrij aardig was opgezet en waar ook een flink aantal indexen aanwezig waren. Door een combintatie van dynamische queries, ongelukkig gekozen indexen en het überbrakke MySQL, werd er tijdens het uitvoeren van de queries géén gebruik gemaakt van de indexen... Gevolg: Een database zo snel als dikke poep door een heel dun trechtertje.

Dus even een index toevoegen of alleen zoeken op kolommen waar een index op staat, het geeft je geen enkele garantie dat er van de indexen gebruik wordt gemaakt. Jij moet met een slimme query de database dwingen om gebruik te maken van de aanwezige indexen. En dat gaat je niet lukken met een scriptje, daar heb je gewoon kennis en kunde voor nodig. Dat valt niet te automatiseren.
 
Leon Kunst

Leon Kunst

11/12/2008 11:59:00
Quote Anchor link
Mja het werkt nu allemaal wel goed anders... Maar ik moet nu dus handmatig aangeven in welke tabellen en kolommen de index staat.

Maar het kan dmv een query dus ook automagisch.
Het resultaat van die query pleur ik dan weer in een andere (against) query. waarin hij gaat zoeken.

Enige wat ik dus moet hebben is een string waarin alle geindexeerde veldnamen staan....

toch vind je standpunt redelijk aan de vage kant.
Indexeren en er dna geen gebruik van maken?

Je moet toch een fulltext - index creeren om erin te zoeken? anders kun je er ook niet op zoeken lijk me...
 
Frank -

Frank -

11/12/2008 12:06:00
Quote Anchor link
Een datamodel maak je eenmalig, de indexen maak je dus ook eenmalig. Je weet dus exact op welke kolommen indexen staan en hoe jouw queries eruit moeten komen te zien om van deze indexen gebruik te maken. Je gaat niet achteraf dynamisch proberen vast te stellen welke queries je wel en niet kunt/wilt maken, dat is niet te doen.

En ja, MySQL heeft vrij snel de neiging om geen gebruik te maken van een index, MySQL is nogal beperkt. Al wordt het wel steeds beter. Je kunt ook fulltext-zoeken in een kolom zonder fulltext index, dat is geen probleem, alleen duurt het wat lang. Fulltext-zoeken wil niet zeggen dat je altijd in de index zoekt, MySQL kan er ook voor kiezen om gewoon record voor record de boel uit te gaan spitten. Dat gebeurt ook wanneer er geen index is.

Geef eens een voorbeeld van een query en een stukje van het datamodel, dan weten we waar je het over hebt.
 
Leon Kunst

Leon Kunst

11/12/2008 12:26:00
Quote Anchor link
Daarom wou ik het ook automatisch laten opzoeken allemaal.

Dit zoeken script is een functie, die wil ik makkelijk in andere websites kunnen implementeren, door maar een paar variabelen bijv mee te geven.

Ik wil dus niet bij elke implementatie handmatig nog eens de kolomnamen etc in hoeven te voeren in't php bestand.

dit werkt ook allemaal goed, daar niet van, en implementatie in ander script is een eitje.

maar ik wil dus gwn die gegevens wat de while lus uitspuugt, in een array.
En buiten de whilelus (maar binnen de foreach) wil ik die weer aanroepen...
 
Frank -

Frank -

11/12/2008 12:40:00
Quote Anchor link
In mijn eerste voorbeeld krijg je buiten de foreach-lus 1 string met alle namen, binnen de foreach krijg je een array met alle namen. Wanneer jij binnen de foreach maar buiten de while de string wilt hebben, zet je deze binnen de foreach:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php


foreach ($get_database_table_names_array as $tabelnamen)
{

  $array = array();
  $string = '';
    // Query opstellen per index
    $get_column_names_in_index_query = mysql_query("SHOW INDEX FROM ".$tabelnamen." FROM db WHERE Index_type = 'FULLTEXT'");
    while ($row = mysql_fetch_array($get_column_names_in_index_query, MYSQL_NUM))
    {

        $array[] = $row[4];
    }


  $string = implode(',', $array);
  print_r($array);
  echo $string;
}


?>
 
Leon Kunst

Leon Kunst

11/12/2008 13:01:00
Quote Anchor link
Bij mijn weten heb ik dit al geprobeerd vannacht. Maar ik zal het thuis alsnog even proberen. Misschien heb ik wel ergens overheen gekeken.

Theoretisch gezien moet dit werken dunkt me...

Bedankt alvast;)
 
Leon Kunst

Leon Kunst

11/12/2008 17:45:00
Quote Anchor link
PG,

Thx,

dit werkt inderdaad.

Wel apart, gister had ik inderdaad wel het zelfde... (eerder die avond)
Ik zal wel verkeerd tegen de output aan gekeken hebben denk ik...

Anyway,

hier kan ik weer mee verder!!

Opgelost!
 
Frank -

Frank -

11/12/2008 18:26:00
Quote Anchor link
Tip: Behalve het uitvoeren van de queries die je aanmaakt, is het ook handig om deze in een query-log weg te schrijven. Wanneer je dan op een gegeven moment de boel werkend denkt te hebben, pak dan eens een paar van deze queries en ga de performance eens meten. En ga met EXPLAIN achterhalen of ze wel efficient met de beschikbare indexen omgaan. Met een beetje pech doet MySQL daar namelijk helemaal niets mee.... Met 100 records merk je dat verschil niet zo, maar met een miljoen records wordt het een heel ander verhaal!
 
Leon Kunst

Leon Kunst

11/12/2008 22:09:00
Quote Anchor link
Okeej, super.

Mja miljoenen records zal ik neit krijgen, aangezien ik alleen de database zal vullen.

maar een aantal tien duizenden records is wel mogelijk ja...
maar of de query dan 1 seconde duurt, of 1,5... dat zal me een zorg zijn.


Voor echt huge databases etc is het dan wel handig inderdaad om de performance te meten..

Thanks voor je tip!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.