Autor Zpráva
Spouter
Profil *
Zdravím,

mám na webu naprogramovaný vlastní vyhledávač a nyní pro něj generuji klíčová slova do databáze. Vše dělám pomocí multi_query.

Z databáze si nejdříve načtu po jednom řádku - název produktu, ean, atd... Z toho si vytvořím klíčová slova, která ukládám do jednoho hromadného sql dotazu a poté vygenerovaná klíčová slova z daného řádku hromadně uložím. Následně se generují opět klíčová slova z dalšího řádku, ale ještě se kontroluje, zda dané klíčové slovo už se v databázi nenachází. Pokud ano, uvede se pouze index.

Dotaz je tedy takový, lze nějakou cestou zajistit, aby vždy multi_query počkalo s dalším hromadným insertem než je kompletně naimportován ten předešlý?

Řešil jsem to tak, že jsem prostě v dané části skript na pevnou dobu uspal pomocí usleep(). To však není 100% spolehlivé. Lze to nějak vyřešit?
Keeehi
Profil
Spouter:
Kód by byl?
Spouter
Profil *
Keeehi:

Celý kód je dlouhý nejspíše by se v něm nikdo nevyznal bez znalosti databáze - uvedu jen ukázku:

Postupně se vše ukládá do sql dotazu:
$sqlv .= "INSERT INTO... ;";
$sqlv .= "INSERT INTO... ;";
$sqlv .= "INSERT INTO... ;";
atd...

Následně se na konci vše pošle do databáze:
        $conn = new mysqli($servername, $username, $password, $dbname);

        mysqli_query($conn,"SET CHARACTER SET utf8 ");

        // Check connection
        if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
        }         
                                                
        $resultv = $conn->multi_query($sqlv);
        if ($resultv === TRUE) {} else { echo "Error: " . $sqlv . "<br>" . $conn->error;}
        $sqlv = ""; /* Zde se sql dotaz vymaže pro další iteraci
        $conn->close(); 
        usleep(200000); /* Zde je skript uspán aby se stihly provést všechny inserty 

Vše se opakuje neustále dokola - počet insertů v jednom dotazu je cca 5-20
Keeehi
Profil
Spouter:
Myslím že takto:
if ($resultv === TRUE) {while ($mysqli->more_result() && $mysqli->next_result());} else { echo "Error: " . $sqlv . "<br>" . $conn->error;}
Spouter
Profil *
Keeehi:
Děkuji - vypadá, že to funguje. Jen to ještě vyhazovalo varování. Upravil jsem to tedy do této podoby:
if ($resultv === TRUE) { do{} while(mysqli_more_results($conn) && mysqli_next_result($conn)); } else { echo "Error: " . $sqlv . "<br>" . $conn->error;}

Zatím jsem to stihl otestovat na 10 000 iteracích a vypadá, že se vše insertuje postupně, tak jak by mělo. Nikde mi to nepřeskočilo řádek.

Ještě jednou díky za pomoc.
Keeehi
Profil
Jasné, takto to dává smysl. Upraveno.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: