Keresés

Részletes keresés

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)
lombi1978 Creative Commons License 2016.01.21 0 0 9957

küldésnél.

Előzmény: Laja73 (9955)
_szergej_ Creative Commons License 2016.01.19 0 0 9956

Valahogy nekem erről ez jut az eszembe:

 

Laja73 Creative Commons License 2016.01.19 0 0 9955

Nézd meg jobban. Hol használod fel azokat a változókat? 

Előzmény: lombi1978 (9954)
lombi1978 Creative Commons License 2016.01.18 0 0 9954

de ha ezt kihagyom /"". A /* Változók feltöltése a mezok tartalmával */ rész után is teljesen feleslegesen van benne az a négy sor./"" akkor honnan tudja a php fájl hogy a htmlben beírt tárgyban mi van?

 

ugyebár én úgy töltöm fel a fájlt hogy htmlben van egy sor pl tárgy mező ebbe beírja a user amit akar és utána a phpmailer elküldi de ha nincs változó ilyen névvel akkor nem fogja elküldeni.

 

 <tr>
    <td height="40">Tárgy:</td>
    <td><input type="text" name="subject" id="subject" class="mezok" maxlength="40" title="Kérem írja be az tárgyat!"></td>
  </tr>

 

ha az első részt kihagyom nem tudja mit írjon be.-

Előzmény: Laja73 (9953)

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