PDO SELECT chunk-olja a választ

PDO SELECT chunk-olja a választ
2014-08-14T07:26:44+02:00
2014-08-14T18:59:16+02:00
2022-10-15T23:06:36+02:00
Vargab
Sziasztok!

A problémám az, hogy átkerült a websit-om máshova és ott csak PDO-van a php-n, ezért át kellett írnom a régi mysql utatsításokat.
Naggyából jó is lett, de felmerült egy gondo:

Adott result = PDO->query('SELECT field1,field2... FROM tbl WHERE id=.. LIMIT 1)->fetch(PDO::FETCH_OBJ);

Az történik, hogy a result-ban a visszaadott elemek 128-byte hosszra vannak chunkolva és nem tudom/értem miért.

Példa egy törten érkező válaszra:
[content_xml] => <?xml version="1.0" encoding="UTF-8"?> <szamla xmlns="http://www.apeh.hu/2005/szamla" xml (innen kellene legyen még fél oldal szöveg a válaszban!)

Ahol a [content_xml] a lekérdezés egyik field-je, ami TEXT field limitálatlan, azaz 65k méret lehet.
Az tök mindegy, hogy ASSOC,OBJ,NUM..stb-ként kérem le a pdo válaszát, a field-ek le vannak vágva 128-byte hosszra (var_dump: string= ... length 128)

Mi történik ilyenkor, miért van ez, mit tudok tenni?

Google nem adott választ, ettől kíméljetek :)

Feltételezem nem a string töri meg a választ, xml adatot tárolok amit ezzel: htmlentities($tomb['xml'],ENT_COMPAT,'utf-8') formázva írok a field-be.
PDO nélkül tökéletesen működött évek óta.

MySQL 5.5.38, tábla InnoDB UTF8_general_ci, PHP 5.5


Elég sürgős a dolog !
Mutasd a teljes hozzászólást!
MEGVAN!!!

A hiba a php5-mysql modulban van sajnos.

A php5.5-höz a php5-mysql modul volt feltelepítve ezzel a kérésem eredménye a fentiekben látható.

Leszedtem és a PHP5-mysqlnd Natív drivert tettem fel, a lekérdezés eredménye:
1454
PDO::FETCH_BOTH (default): returns an array indexed by both column name and 0-indexed column number as returned in your result set PDO::FETCH_BOUND: returns TRUE and assigns the values of the columns in your result set to the PHP variables to which they were bound with the PDOStatement::bindColumn() method PDO::FETCH_CLASS: returns a new instance of the requested
..

Azaz a gondot a mysql driver okozta, valamiért limitálta a visszaadott field méretét 128 byte-ban. Hiába állítottam bármit is benne paraméterként.

Szóval PHP5.5 + mysql5.5 HASZNÁLJ php5mysqlnd pdo drivert!!!!!!!!
Mutasd a teljes hozzászólást!

  • bound-dal is levágja?

    $stmt = $dbh->prepare("SELECT content_xml FROM tbl WHERE id=... LIMIT 1"); $stmt->execute(); $stmt->bindColumn(1, $content_xml); $stmt->fetch(PDO::FETCH_BOUND); echo strlen($content_xml);
    Mutasd a teljes hozzászólást!
  • Edig csak ezt sikerült kinyernem:

    SELECT id,invoice_number,content_xml, content_meta FROM pub_invoices WHERE id = 461 LIMIT 1
    object(PDORow)[56]
    public 'queryString' =>
    string
    'SELECT id,invoice_number,content_xml, content_meta FROM pub_invoices WHERE id = 461 LIMIT 1' (length=91)
    public 'id' =>
    string
    '461' (length=3)
    public 'invoice_number' =>
    string
    '2013P00000154' (length=13)
    public 'content_xml' =>
    string
    '&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
    &lt;szamla xmlns=&quot;http://www.apeh.hu/2005/szamla&quot; xml' (length=128)
    public 'content_meta' =>
    string
    '&lt;meta&gt;
    &lt;dijbekero&gt;Proforma&lt;/dijbekero&gt;
    &lt;felhasznaloiazonosito&gt;2764&lt;/felhasznaloiazonosito&gt;
    &lt;lab' (length=128)


    Kipróbáltam, átírtam a field tartalmat sima text-re, jó nagyra, akkor is csak az első 128 karaktert adja vissza a pdo és nem értem miért

    Tehát nem string kezelési dolog.
    Mutasd a teljes hozzászólást!
  • Fura. Be tudnád másolni ennek az eredményét?
    SELECT id,invoice_number,content_xml,LENGTH(content_xml) as content_xml_length,HEX(content_xml) as content_xml_hex FROM pub_invoices WHERE id = 461 LIMIT 1

    szerk:
    használsz valamilyen xdebug vagy hasonló kiegészítőt? Nem lehet, hogy annak a var_dump-ja vágja le és valójában meg jó (ezért raktam be az strlen-t)? Egy sima var_dump-nak nem olyan a kimenete mint amit bemásoltál, hanem pl. ilyen:
    object(PDORow)#1 (2) { ["queryString"]=> string(3) "..." ["id"]=> string(3) "461" }
    Mutasd a teljes hozzászólást!
  • Közben próbáltam többféle képpen lekérdezni, de a válasz azonos, 128 byte length.
    Néztem a pdo doc-t, hogy van large_field kezelés, de az csak 4kB fölötti, ez sokkal kissebb.

    Itt a lekérdezés:

    Array ( [id] => 461 [0] => 461 [invoice_number] => 2013P00000154 [1] => 2013P00000154 [content_xml] => PDO::FETCH_BOTH (default): returns an array indexed by both column name and 0-indexed column number as returned in your [2] => PDO::FETCH_BOTH (default): returns an array indexed by both column name and 0-indexed column number as returned in your [content_xml_length] => 1454 [3] => 1454 [content_xml_hex] => 20202020202020202050444F3A3A46455443485F424F5448202864656661756C74293A2072657475726E7320616E20617272617920696E646578656420627920 [4] => 20202020202020202050444F3A3A46455443485F424F5448202864656661756C74293A2072657475726E7320616E20617272617920696E646578656420627920 )
    Mutasd a teljes hozzászólást!
  • Egy próbát megérne az ebben a témában lévő megoldás: stackoverflow
    Mutasd a teljes hozzászólást!
  • Kipróbáltam, nem hozott eredményt sajnos.
    De emeltem a mysql cache,key..stb-t és változatlan az eredmény.

    object(PDOStatement)[3]
    public 'queryString' =>
    string
    'SELECT content_xml, content_meta FROM pub_invoices WHERE id = 461 LIMIT 1' (length=73)

    string
    ' PDO::FETCH_BOTH (default): returns an array indexed by both column name and 0-indexed column number as returned in your' (length=128)

    Array ( [id] => 461 [0] => 461 [invoice_number] => 2013P00000154 [1] => 2013P00000154 [content_xml] => PDO::FETCH_BOTH (default): returns an array indexed by both column name and 0-indexed column number as returned in your [2] => PDO::FETCH_BOTH (default): returns an array indexed by both column name and 0-indexed column number as returned in your [content_xml_length] => 1454 [3] => 1454 [content_xml_hex] => 20202020202020202050444F3A3A46455443485F424F5448202864656661756C74293A2072657475726E7320616E20617272617920696E646578656420627920 [4] => 20202020202020202050444F3A3A46455443485F424F5448202864656661756C74293A2072657475726E7320616E20617272617920696E646578656420627920 )
    Mutasd a teljes hozzászólást!
  • A xdebug megy a php-vel, meg a firephp is fent van a mozillaban, ezért formáz frankón. De attól a vardump 128 az annyi és a kódban is hiányzik a válaszból jövő érték, szal sajnos nem design kérdés
    Mutasd a teljes hozzászólást!
  • MEGVAN!!!

    A hiba a php5-mysql modulban van sajnos.

    A php5.5-höz a php5-mysql modul volt feltelepítve ezzel a kérésem eredménye a fentiekben látható.

    Leszedtem és a PHP5-mysqlnd Natív drivert tettem fel, a lekérdezés eredménye:
    1454
    PDO::FETCH_BOTH (default): returns an array indexed by both column name and 0-indexed column number as returned in your result set PDO::FETCH_BOUND: returns TRUE and assigns the values of the columns in your result set to the PHP variables to which they were bound with the PDOStatement::bindColumn() method PDO::FETCH_CLASS: returns a new instance of the requested
    ..

    Azaz a gondot a mysql driver okozta, valamiért limitálta a visszaadott field méretét 128 byte-ban. Hiába állítottam bármit is benne paraméterként.

    Szóval PHP5.5 + mysql5.5 HASZNÁLJ php5mysqlnd pdo drivert!!!!!!!!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd