Portál AbcLinuxu, 8. května 2024 22:10


Dotaz: Oprava php kódu

21.5.2014 22:54 Dr
Oprava php kódu
Přečteno: 409×
Odpovědět | Admin
Ahoj, opraví mi prosím někdo tento kód ? Fakt už nevím jak :-( Díky
$ids = '2,6,12,15,13,14,7,8,9,10,';
$stmt = $pdo->prepare('SELECT * FROM table WHERE col IN (?) ORDER BY ID ASC;');
$stmt->execute(array($ids));
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

22.5.2014 00:10 Lucius
Rozbalit Rozbalit vše Re: Oprava php kódu
Odpovědět | | Sbalit | Link | Blokovat | Admin
$ids udelej rovnou jako pole - $ids = array(2,6,12,15,13,14,7,8,9,10)

a pokud to neni mozne tak ten retezec $ids prozen pres fu explode -ta vraci pole

explode(',',$ids);

http://cz1.php.net/explode
22.5.2014 00:24 Dr
Rozbalit Rozbalit vše Re: Oprava php kódu
Jako takto? To nefunguje..
$ids = array(2,6,12,15,13,14,7,8,9,10);
$stmt = $pdo->prepare('SELECT * FROM table WHERE col IN (?) ORDER BY ID ASC;');
$stmt->execute($ids);
tohle funguje ale je mi to k ničemu :-(
$stmt = $pdo->prepare('SELECT * FROM table WHERE col IN (2,6,12,15,13,14,7,8,9,10) ORDER BY ID ASC;');
$stmt->execute();
wamba avatar 22.5.2014 01:24 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Oprava php kódu
V dokumentaci pro Perl knihovnu DBI se píše

Also, placeholders can only represent single scalar values. For example, the following statement won't work as expected for more than one value:
"SELECT name, age FROM people WHERE name IN (?)"    # wrong
a předpokládám, že v PHP to bude podobné. Tedy pokud je to náhodný počet libovolných čísel, tak pravděpodobně budete muset spouštět prepare pro každé $ids zvlášť.
This would have been so hard to fix when you don't know that there is in fact an easy fix.
22.5.2014 10:53 Lucius
Rozbalit Rozbalit vše Re: Oprava php kódu
Pokud se nepletu,tak potrebujes ten jeden otaznik v IN (?) nahradit poctem hodnot v $ids

takze

'SELECT * FROM table WHERE col IN (?) ORDER BY ID ASC;'

by melo vypadat nejak takto

$ids = array(2,6,12,15,13,14,7,8,9,10);

SELECT * FROM table WHERE col IN ('.trim(str_repeat ("?,", count($ids)),',').') ORDER BY ID ASC;

Je to jen nastrel, nemam to ted kde kontrolovat, ale tak nejak by to melo jit
23.5.2014 11:40 Logik
Rozbalit Rozbalit vše Re: Oprava php kódu
To jde, pokud v dotazu nejsou další proměnný na bindování, jinak se z toho člověk pak zvence při bindování.

Jde se taky na bindování vykašlat a sestavit dotaz:
$query=$pdo->prepare(
  'SELECT * FROM table WHERE col IN ('
  .implode(',', array_map(array($pdo, 'quote'), $ids)) . 
  ') ORDER BY ID ASC;'
);
23.5.2014 12:21 Lucius
Rozbalit Rozbalit vše Re: Oprava php kódu
Proc? $ids v tom prikladu je uzavrena mnozina, ktera je jen podmnozinou vsech parametru - jediny rozdil by byl v tom, ze u takto jednoducheho dotazu je vlastne $ids zaroven i polem vsech parametru, pokud by mel dlalsi parametry tak proste $ids spoji s polem pro dalsi parametry.
23.5.2014 12:33 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Oprava php kódu
My vlastně ani nevíme, kde se vzala proměnná $ids. Určitě ji takto neplní. Možná je to uživatelský vstup, možná výsledek dotazu v databázi. Každý případ se řeší jinak.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
23.5.2014 12:40 Lucius
Rozbalit Rozbalit vše Re: Oprava php kódu
To jiste, ale nez se dostane k prepare tak je uzavrena - je jedno odkud prijde, proste ve chvili prepare ma pevne dane hodnoty - takze to muze zpracovat jak jsme tu uvadeli reseni tu ma vic a pokud bude mit sql nejake dlasi parametry , tak je proste po tom zpracovani spoji s $ids. Kdyz si na to napise nejakou fu, tak to muze mit i docela pekne integrovatelne do jakehokoli kodu.
23.5.2014 12:46 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Oprava php kódu
Spíš bych ji označil za serializovanou. Taková práce s daty není zrovna standardní.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
22.5.2014 11:26 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Oprava php kódu
Odpovědět | | Sbalit | Link | Blokovat | Admin
$ids = array(2, 6, 12, 15, 13, 14, 7, 8, 9, 10);
$sql = "SELECT * FROM table WHERE col IN (" .
    implode(", ", array_fill(0, count($ids), "?")) .
    ") ORDER BY ID ASC;";
$stmt = $pdo->prepare($sql);
$stmt->execute($ids);
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
22.5.2014 16:15 Dr
Rozbalit Rozbalit vše Re: Oprava php kódu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Díky chlapáci a můžu nějak ten SELECT již nahrazené otazníky za hodnoty nějak vidět? Zkoušel jsem var_dump() ale tam vidím jen otazníky. Díky moc.
22.5.2014 16:39 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Oprava php kódu
Však ty otazníky se nahrazují na serveru až po kompilaci SQL dotazu.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
22.5.2014 18:34 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Oprava php kódu

Zjednodušeně: nemůže protože to v zásadě neexistuje, MySQL server má dotaz s otazníky + sadu hodnot a vnitřně si to tam dosadí ... juk.

Nicméně to bala trochu „lež dětem“, pro dospělé je to trochu zamotanější na více úrovních, například dle PDO::ATTR_EMULATE_PREPARES lze zjistit (a nastavit) jestli, jsou to prováděné „server-side“ připravené dotazy nebo to PDO emuluje a tedy teoreticky, ten kompletní dotaz existuje sestavený na úrovni PDO.

To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.