mysql több szavas keresés

Minap szükségem volt egy olyan keresőre ahol nem csak egy szó ill szótördelékre lehet keresni.
Ugye a full text indexel kialakított táblába szépen lehet keresni a match against párossal.
Én úgy oldottam meg, hogy az input mezőt explode-val szétvágtam, majd mindegyik elé fűztem egy + jelet, és összeraktam. Term védelemmel ellátva mindezt.
Ami viszont elkerülte a figyelmemet, és e poszt megírására sarkalt az a php azon áldott tulajdonsága, hogy a szám nem string hanem szám ha nem jelzem.
Ezért pl.: 123456 cikkszámra nem adott találatot.
Megoldása:
$x=(string)$x;

Tudom, hogy a tutorial szépen leírja, de ráment 20 perc bugvadászat, mert nem gondoltam erre:)

Hozzászólások

a szám nem string hanem szám ha nem jelzem

Szerintem így normális.
Egyébként egy másik megoldás:

$x="$x";

Ha $x egy string valami határolóval való szétválasztásával kapott akármi, akkor "illik" annak is string-nek lennie:

$vector = '12,13';
list($x,$y) = explode(',', $vector);
var_dump($x, $y);

A kimenete: string(2) "12", string(2) "13".

Pch megoldása (cast to string) szerintem több szempontból is jobb: olvashatóbbá teszi a kódot (benne van, hogy ott kifejezetten stringre akarja castolni) és valszeg gyorsabb is, mert nincs változóbehelyettesítéses, string értelmezéses játék (lásd, pl. Java-ban melyik a gyorsabb: String.format("%s", obj) vs. obj.toString()).

BlackY

Amit írtál, azt értem, de valaki félreértett valamit pch-tól.
Én úgy értettem, hogy az a "baja", hogy lett egy $x változója, ami szám, és ő sztringként akarja használni. Így értve az explode-os részt nem értem, hogy jön ide :)

Fogalmam sincs egyébként, hogy az én vagy pch megoldása a gyorsabb, de speciel nekem a "$x" olvashatóbb, illetve sokszor szoktam még a sztringbe mást is írni.

Az $x változó int és stringként akarja használni use case stimmel, csak a leírásban azt írja, hogy explode, +-al prefixeli, és utána a PHP már számként kezeli, valahogy nekem nem stimmel. A stringbe más írás is stimmel.

<?php
$start = microtime(true);
$int = 123456;
for($j = 0; $j < 1000; $j++) {
        for($i = 0; $i < 10000; $i++) {
                $string = "$int";
        }
}
echo (microtime(true) - $start), PHP_EOL;
$start = microtime(true);
for($j = 0; $j < 1000; $j++) {
        for($i = 0; $i < 10000; $i++) {
                $string = (string)$int;
        }
}
echo (microtime(true) - $start), PHP_EOL;

Nálam átlag olyan 10+%-al lassabb az idézőjeles.

BlackY

Ez volt a kód: [szerk]

$ kerlink=$_GET['masodik'];
$ kerlink = vedelem(trim($kerlink));
$ kerlink=htmlspecialchars($kerlink);
$ kerlink=explode(" ",$kerlink);
$ count = count($kerlink);
for($ i=0;$i <$ count;$ i++){
if ($ i>0) $kereses.=" ";
$ ker_darab=trim($kerlink[$i]);
$ ker_darab=(string)$ker_darab; < ez került bele utólag
$ kereses.="+".$ ker_darab;
}
..

..matc h (t_nev,t_cikkszam) agains t ('".$kereses."' IN BOOLEA N MOD E)..

ha a termék pl.: 123456 volt nem találta meg. (akkor a POST-ba 123456 volt)
A (string) beírása után ment tökéletesen..

Igen, elvileg explode után is stringnek kellett volna lennie, de más ötletem nemvan.

pch
--
http://www.buster.hu "A" számlázó
--

Egyre inkább kezdek a "passz"-ra futni (nem lehet, hogy a szám rövidebb volt, mint az ft_min_word_length?). Egy PHP verziószámot még tudnál nézni? Ebben a kódban ugyanis nagyjából esélye sincs bárhol számként értelmezni a string-et (pl. akkor a + kapásból eltűnne előle)

Szerk.: az ft_min_word_length meg hülyeség volt tőlem, akkor a string-re kasztolás után is ugyanazt is kéne kapnod.

BlackY