[OPGELOST] Column_name van FULLTEXT indexes weergeven
Het lijkt zo simpel, maar toch werk ik me er de hele avond al kapot op...
Het script:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
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]);
}
}
?>
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
?>
$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 -
En als je die while er uit haalt en alleen een enkele array laat volproppen met data (om te testen)
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...
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 -
dit stukje:
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)
1
2
3
4
5
6
7
8
9
10
11
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]);
}
}
?>
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)
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.
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.
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.
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...
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.
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...
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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;
}
?>
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;
}
?>
Theoretisch gezien moet dit werken dunkt me...
Bedankt alvast;)
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!
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!
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!