Keresés

Részletes keresés

halaloszto Creative Commons License 2016.02.11 0 0 9987

1. életemben nem programoztam php-ben, és mysql-el sem.

 

2. baromi klafa a source formattered!!! honnan van??

 

3. rákattintottam a mysqli_next_result-ra, és felhozta a doksit.

 

mysqli_next_result

mysqli::next_result -- mysqli_next_result — Prepare next result from multi_query

Description ś

Procedural style

bool mysqli_next_result ( mysqli $link )

Prepares next result set from a previous call to mysqli_multi_query() which can be retrieved by mysqli_store_result() or mysqli_use_result().

 

Ezt elolvasva ez egy olyan valami, ami visszatér azzal hogy van-e még result, és azt a resultot prepareli is, utánna a store result-al vagy user result-al le kell fetchelni.

 

Viszont a te while feltételedben hozzá van éselve a more_results, ami miatt ha nincs több result akkor kilép.

 

Erős tippem, hogy az történik, hogy az és miatt muszáj mindkettőt kiértékelni, és balról jobbra haladva teszi. A next_result kiértékelése előveszi az utolsó resultot és igazat ad vissza mert volt mit elővegyen, ezután értékelődik ki a more_results ami hamisat ad vissza, mert nincs több, pont az előbb lőtted el az utolsót. Így kilép, és az utolsó ottmarad lefetcheletlenül.

 

Elnézést ha nem voltam php meg mysql szabatos, de nagyon nem a területem.

 

Vajk

Előzmény: hellsing (9984)
hellsing Creative Commons License 2016.02.11 0 0 9986

A ciklusfeltételem (szerintem) Laja #9963-as megoldásának procedurális változata, ami kivédi a strict hibát. Ha ezt visszaalakítom, ott vagyok, ahol kezdtem az egészet.

 

Kérlek áruld el a megoldást, mert én nem tudok jobbat kitalálni. Sajnos/szerencsére nem ebből élek, nincs is akkora gyakorlatom, mint nektek.

Előzmény: NevemTeve (9985)
NevemTeve Creative Commons License 2016.02.11 0 0 9985

A do-while ciklusod ciklusfeltétele valami ilyesmi: térjünk át a következőre, feltéve hogy még azután is van egy.

Előzmény: hellsing (9984)
hellsing Creative Commons License 2016.02.10 0 0 9984

Jé, ez működik! Majdnem...

 

Itt az új, minden sallangtól mentes függvényem.

 

    function dbMultiQuery ( $dbConn , $sql ) {
       
if ( mysqli_multi_query ( $dbConn , $sql ) ) {
           
do {
               
if ( $result = mysqli_store_result ( $dbConn ) ) {
                   
while ( $row = mysqli_fetch_row ( $result ) ) {
                       
$r [] = $row ;
                   
}
                   
mysqli_free_result ( $result ) ;
               
}
           
} while ( mysqli_next_result ( $dbConn ) && mysqli_more_results ( $dbConn ) ) ;
       
}
       
return ( $r ) ;
   
}

 

Ráküldök egy sor sql-t, ami ilyenekből áll:

  • TRUNCATE TABLE _test;
  • ALTER TABLE _test AUTO_INCREMENT=1;
  • INSERT _test SET df=" . rand ( 10000, 99999 ) . "; (×100)
  • UPDATE _test SET df=1 WHERE df<20000;
  • UPDATE _test SET df=5 WHERE df BETWEEN 50000 AND 59999;
  • SELECT * FROM _test WHERE df=1;
  • SELECT * FROM _test WHERE df=5;
  • SELECT * FROM _test WHERE df<80000;

Minden tökéletesen lefut, kivéve egy dolgot: akármennyi select van (és a pma szerint lenne mit hoznia, de ) még sincs meg az utolsó select eredménye. Miért?

hellsing Creative Commons License 2016.02.10 0 0 9983

Ööö... nem. Azt nem értem, hogy ha külön-külön OK a függvényemnek akármennyi insert és update, akkor egyben miért nem. A logika nem világos, de most megpróbálok rájönni.

Előzmény: NevemTeve (9982)
NevemTeve Creative Commons License 2016.02.10 0 0 9982

Mármint azt akarod kérdezni, hogy miért sikerül az első batch, és miért nem a második. Arra gyanakszol, hogy talán az egyes batch-ekben lévő utasítások fajtája (INSERT, CREATE TABLE, UPDATE, stb) számít. Nem, az nem számít. Az számít, hogy nem volt elég 'next_result' hívás. Laja73 olvtárs ezt már írta is a (9963)-ban.

Előzmény: hellsing (9981)
hellsing Creative Commons License 2016.02.10 0 0 9981

Azért a MySQL kf. parancsain már túl vagyok :) Tudom, hogy mi a result set, affected rows meg hasonlók.

 

Az még nem tiszta, hogy miért van 100 insert/update/selectre elég next_resultom, de ha ezek egy csomagban vannak, akkor már nincs. Meg egy truncate + alter table párosra sincs.

 

Köszönöm az eddigieket!

Előzmény: NevemTeve (9980)
NevemTeve Creative Commons License 2016.02.10 0 0 9980

De azért addig oké, hogy alapvetően kétféle utasítás van? Az egyik a SELECT, a másik meg a mindig más (DML, DDL, etc)?

 

A MySql (vagy a PHP) derék programozói mindent 'query'-nek neveznek, de attól még fontos tudni, hogy az egyikből (SELECT) jön kifelé eredmény, amit lehet FETCH-elni; a másikból meg nem, csak olyan státusz-infó jön, hogy siker/hibakód, érintett sorok száma, automatikusan generált ID értéke.

 

Persze mindettől függetlenül a programoddal az a baj, hogy nem hívod elégszer a next_result-ot, már a 9963-ban írta neked Laja73 olvtárs.

Előzmény: hellsing (9978)
hellsing Creative Commons License 2016.02.09 0 0 9979

Bakker, csak nem azért, mert lefut a csomag insert része, aztán az első update-nél megtörténik a return?

 

Ez ugrott be, de nem lehet, mert a tiszta return csomagnál ugyanez lenne a helyzet.

Előzmény: hellsing (9978)
hellsing Creative Commons License 2016.02.09 0 0 9978

Tényleg nem értelek. Ha megnézed a kódomat, nincs fetch, ha nincs result.

 

if ( $result = MySQLi_store_result ( $dbConn )){                // ha van $result
    while ( $row = MySQLi_fetch_assoc ( $result )){            // akkor van fetch
        $r[] = $row;                                                                // itt most egyszerűsítettem
    }
    MySQLi_free_result ( $result );
}
else {                                                                                  // ha meg nincs, akkor...
    if ( MySQLi_errno ( $dbConn) == 0 ){
        return ( "success" );                                                    // ha mysqli_errno == 0, akkor sincs,
    }
    else {
        return ( MySQLi_errno ( $dbConn ) . " - " . MySQLi_error ( $dbConn ));        // de ha nem annyi, akkor sincs
    }
}

Csak-update csomagnál visszajön, hogy success, insertnél ugyanúgy, n+1 insert ÉS update csomagnál meg out of sync.

Lehet, hogy egy egyszerű pontszemű lény vagyok, de nem jövök rá, hogy a kérdésed hogy a fenébe kapcsolódik a 2014 - Out of sync hibához. Sajnálom. Ha tudod a megoldást, kérlek írd le egyenesen: azért van out of sync, mert...

NevemTeve Creative Commons License 2016.02.09 0 0 9977

Ezen nagyon derék dolog, dicséretes, helyeslem. Na most akkor próbáljunk egy másik kérdést: Ugye az lehetetlen, hogy query (SELECT) és non-query (INSERT, UPDATE, DELETE, ...) kevereg egy csomagban? Mert ha csak non-query-k vannak, akkor minek a fetch?

Előzmény: hellsing (9976)
hellsing Creative Commons License 2016.02.09 0 0 9976

Mert egy svájcibicskát szeretnék összehozni, aminek bármit átküldhetek. Szerintem adódhat úgy, hogy keveregni fognak, pl. insert, utána select.

 

Nem hiszem, hogy ez lenne a gond. H n darab update-et küldök rá, az lefut. Gond csak akkor van, ha bármit bármivel keverek (ahogy eddig látom).

Előzmény: NevemTeve (9971)
NevemTeve Creative Commons License 2016.02.09 0 0 9975

Szerintem fuss neki a kérdésnek újra, de most figyelmesen.

Előzmény: hellsing (9973)
hellsing Creative Commons License 2016.02.08 0 0 9974

Bocs, már túl este van. Nincs olyan, hogy insert és update egyben. De nem gondolom, hogy azért lesz out of sync, mert fetch-elem az üres result-ot. Max. fut a kód egy milliszekundumot feleslegesen.

Előzmény: hellsing (9973)
hellsing Creative Commons License 2016.02.08 0 0 9973

Nem lehetetlen, próbáltam olyat, hogy beszúrok 100 sort aztán többféleképpen update-elem az egész táblát. Most így hirtelen nem ugrik be példa, hogy ez mire jó a gyakorlatban, csak tesztelgettem a multi_query-t. Olyat nem próbáltam, hogy insert - update - insert megint - stb. egyben.

 

Olyan viszont volt, hogy truncate és auto increment nullázás ment egy multi_query-ben, és erre is out of sync-et kaptam.

 

Egy olyan saját függvényt szeretnék összehozni, amit bárhol alkalmazhatok, csak átdobom neki az SQL-eket tömbben és szépen feldolgozza. Csak ezt az out of sync-et nem értem, hogy miért jön elő. Mert akkor is előjön, ha átmegy 100 insert és a függvény újra futtatásával követi ezt valamennyi update, kb így:

 

    $r1 = dbMultiQuery ( $sql_inserts );

    $r2 = dbMultiQuery ( $sql_updates );

 

Ilyenkor az $r1 lefut, az $r2 out of sync. Ha az $r1-et kihagyom, akkor az $r2 simán lefut. Órákat töltöttem már a doksival, fórumokban és a Google-lel, de nem jövök rá, hogy mi a baja.

Előzmény: NevemTeve (9971)
hellsing Creative Commons License 2016.02.08 0 0 9972

multy multi

Előzmény: hellsing (9970)
NevemTeve Creative Commons License 2016.02.08 0 0 9971

Ugye az lehetetlen, hogy query (SELECT) és non-query (INSERT, UPDATE, DELETE, ...) kevereg egy csomagban? Mert ha csak non-query-k vannak, akkor minek a fetch?

Előzmény: hellsing (9970)
hellsing Creative Commons License 2016.02.08 0 0 9970

Ne haragudj, lehet, hogy rossz legókockákat nézegetek, de nem tudom összerakni, hogy mire gondolsz. A strict hibát önerőből kiküszöböltem (amúgy a php.net példája magával hozza a strict hibát), az meg nem esik le, hogy a 2014-es Out of sync hibát hogy kerülhetem el.

 

A 2014-esről ennyit ír a MySQL doksija::

 

    Commands out of sync

 

    If you get Commands out of sync; you can't run this command now in your client code, you are calling client functions in the wrong order.

    This can happen, for example, if you are using mysql_use_result() and try to execute a new query before you have called mysql_free_result().

    It can also happen if you try to execute two queries that return data without calling mysql_use_result() or mysql_store_result() in between.

 

Akárhogy nézem a kódomat, sz'tem minden benne van, aminek ott kell lennie: először multy_query, aztán store_result, aztán free_result. A 2014-es hiba csak akkor jön elő, ha keverem az utasításokat (pl. insert és update, vagy truncate table és alter table egy csomagban). Ha n+1 insert vagy update van egyben, az hibátlanul lefut.

 

Légszi egy kicsit szájbarágósabb stílusban rávezetnél a megoldásra?

Előzmény: NevemTeve (9969)
NevemTeve Creative Commons License 2016.02.04 0 0 9969

(9963)-at próbáltad? És miért nem?

Itt nézd meg a példákat: http://php.net/manual/en/mysqli.multi-query.php

Előzmény: hellsing (9967)
hellsing Creative Commons License 2016.02.03 0 0 9968

Wow. Ezzel a kérdéssel még a Stackoverflow-on s találtam választ. Remek...

Előzmény: hellsing (9967)
hellsing Creative Commons License 2016.02.02 0 0 9967

Kéne még segítség a tanulásban. Ha kétszer egymás után futtatom a lenti dbMultiQuery függvényemet, az első csomag (mondjuk insertekkel) simán lefut, a másodikra - ami többféleképpen update-eli az egész táblát - viszont hibaüzenetet dob a MySQL: "2014 - Commands out of sync; you can't run this command now".

(Azt tudom, hogy nem sok értelme van ugyanabba a táblába több insertet MySQLi_multi_query-vel átküldeni, de csak próbálom felfogni a multi_query működését.)

A MySQL doksi szerint ez a hiba akkor fordul elő, ha új lekérdezés indul az előző mysqli_free_resulttal való lezárása nélkül. Ahogy lentebb bemásoltam, benne van a függvényemben az utasítás, enélkül (gondolom) az első, insertes csomag se futna le. Ha az insertet kihagyom és csak az update részt futtatom, az rendben lefut. Mi a gond?

Még valami... Próbából betettem az első, insertes sql csomag elejére két sort: "TRUNCATE TABLE _test;", "ALTER TABLE _table AUTO_INCREMENT=1;". Ha ezek ott vannak, akkor is jön a 2014-es hiba, pedig csak egyszer futtatom a dbMultiQuery függvényemet. Kiakad a MySQL, ha többféle utasítást kap egy multi csomagban? Vagy van valami időzítési trükk, amit nem vettem volna észre a doksiban (pedig egy tucat helyen utánaolvastam)?

hellsing Creative Commons License 2016.02.01 0 0 9966

Ó. Már tudom. Rossz helyre írtam. Bocs.

Előzmény: hellsing (9965)
hellsing Creative Commons License 2016.02.01 0 0 9965

Jól értem, hogy a mysqli_multi_query-ből nem lehet minden egyes SQL-sorra status code-ot kinyerni?

 

Ezt próbáltam:

 

if ( $result = MySQLi_store_result ( $dbConn )){
    while ( $row = MySQLi_fetch_assoc ( $result )){
        if ( $key && array_key_exists ( $key, $row )){
            $r[$row[$key]] = $row;
            unset ( $r[$row[$key]][$key] );
        }
        else {
            $r[] = $row;
        }
    }
    MySQLi_free_result ( $result );
}
else {
    if ( MySQLi_errno ( $dbConn) == 0 ){
        return ( "success: " . MySQLi_affected_rows ( $dbConn ));
    }
    else {
        return ( MySQLi_errno ( $dbConn ) . " - " . MySQLi_error ( $dbConn ));
    }
}

...de az eredmény 10 sikeres update után: success: 0. Miért nem 10 (összes update) vagy 1 (utolsó update)? Csekkoltam, az update 10× megtörténik.

hellsing Creative Commons License 2016.02.01 0 0 9964

Köszönöm, erre már megvan a megoldás. Most ezt a multi-update visszajelzést szeretném összehozni valahogy.

Előzmény: Laja73 (9963)
Laja73 Creative Commons License 2016.02.01 0 0 9963

Sajnos én még nem használtam, de egy lehetséges OO megoldás így néz ki:

 

while ($mysqli->more_results() && $mysqli->next_result());

 

Vmi hasonlót?

Előzmény: hellsing (9960)
NevemTeve Creative Commons License 2016.02.01 0 0 9962

Mármint az a kérdés, hogy kell-e hibaellenőrzés a mysqli_store_result után? Indulj ki abból, hogy hibaellenőrzés mindig kell.

Előzmény: hellsing (9961)
hellsing Creative Commons License 2016.01.31 0 0 9961

Maradt kérdés: rendben működik a function-öm, de hogy lehet egy mysql_multi_query-ből kinyerni, hogy az egyes UPDATE sql parancsok sikeresek voltak-e?

 

    function dbMultiQuery ( $dbConn, $sql, $key = false ){
        require_once ( "./includes/dbConn.php" );
        if ( is_array ( $sql )){                                                                  // ennek van értelme, még ha itt nem is látszik :)
            foreach ( $sql as $q ){
                $query .= $q;
            }
            $r = array();
            if ( mysqli_multi_query ( $dbConn, $query )){
                do {
                    if ( $result = mysqli_store_result ( $dbConn )){            // itt kéne valahogy elcsípni?
                        while ( $row = mysqli_fetch_assoc ( $result )){
                            if ( $key && array_key_exists ( $key, $row )){
                                $r[$row[$key]] = $row;
                                unset ( $r[$row[$key]][$key] );
                            }
                            else {
                                $r[] = $row;
                            }
                        }
                        mysqli_free_result ( $result );
                    }
                    if ( !mysqli_more_results ( $dbConn )){
                        break;
                    }
                } while ( mysqli_next_result ( $dbConn ));
                return ($r );
            }
            else {
                return ( "failed ");
            }
        }
        else {
            return ( "failed" );
        }
    }

hellsing Creative Commons License 2016.01.31 0 0 9960

Az if után betettem mégy egyet:

 

            if ( !mysqli_more_results ( $dbConn )){
                break;
            }

 

...és így nincs Strict üzenet. Ha van jobb megoldás, kíváncsi vagyok rá.

Előzmény: hellsing (9959)
hellsing Creative Commons License 2016.01.31 0 0 9959

Help. Most először próbálgatom a mysqli_multi_query-t. A gyakorláshoz szinte 1 az 1ben kimásoltam a php.net doksijából a példát:

 

$r = array();

if (mysqli_multi_query($link$query)) {
    do {
        if ($result mysqli_store_result($link)) {
            while (
$row mysqli_fetch_row($result)) {
               
$r[] = $row[0];
            }
            
mysqli_free_result($result);
        }
    } while (mysqli_next_result($link));
}

Ha viszont ezt futtatom, akkor az eredményekkel együtt ezt kapom:

 

    Strict Standards: mysqli_next_result(): There is no next result set. Please, call mysqli_more_results()/mysqli::more_results() to check whether to call this function/method in

 

Próbáltam az utolsó sorban a mysqli_next_resultot lecserélni, de akkor végtelen ideig (=30mp) fut a php script. Próbáltam az if ( $result= mellé is betenni, de az se segít. Így gyorsan lefut a script, de ugyanúgy jön a strict üzenet. Mi a jó megoldás (már azon kívül, hogy kikapcsolom a strict üzeneteket)?

lombi1978 Creative Commons License 2016.01.25 0 0 9958

csak jeleznél sikerült a képfeltöltés emailbe szövegrésszel együtt.:)

Előzmény: lombi1978 (9957)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!