Autor Zpráva
final
Profil
Zdravím, neviem si už rady..
$var="1,2";
$values=split(",",$var);
$sql = sprintf('update table set value=1 where id in (%s)',implode(',', array_fill(0, count($values), '?')));
echo $sql; // update table set value=1 where id in(?,?)
$stmt = $db->prepare($sql);
foreach ($values as $value) {
    $str=$str."i";
}
echo $str."-".implode(',',$values); // ii-1,2
$stmt->bind_param('$str', implode(',',$values));
$stmt->execute();                
A vypíše chybu:
mysqli_stmt::bind_param() [<a href='mysqli-stmt.bind-param'>mysqli-stmt.bind-param</a>]: Number of elements in type definition string doesn't match number of bind variables in
Absolútne tomu nerozumiem..všetky premenné čo si vypíšem sedia, čiže nechápem prečo by mal byť zlý počet bind-nutých parametrov a počet v $sql..

Nejaký nápad?
ďakujem
Kajman
Profil
Na řádku 10 máte navíc uvozovky kolem $str.
final
Profil
Odstránil som ich a error ostáva ten istý..
Tori
Profil
final:
Správně byste měl hodnoty zadat každou zvlášť jako parametr:
$val1 = 1;
$val2 = 2;
$stmt->bind_param($str, $val1, $val2);
Zkoušela jsem to nějak obejít přes call_user_func_array, jenže ty parametry nelze předat hodnotou, ale jen referencí. Takže řešení neporadím, mysqli moc neznám, používám dibi.
Mike8748
Profil
final:
na řádku 10 jako první parametr předáváte "ii", tedy funkce očekává další dva parametry (typ integer). ovšem ty dál předáváš pouze jeden parametr, typu string
proto ta chyba.
Tori
Profil
Koukněte se do komentářů k bind_param, jsou tam nějaké použitelné možnosti (např. přes reflexi).
final
Profil
Tori:
začína sa mi nepozdávať celé mysqli, je dibi lepšia voľba?
Tori
Profil
A co pro vás znamená „lepší“? Jinak těžko porovnávat, když každé je na jiné úrovni. dibi může interně používat mysqli driver, ale i jiný. Když si napíšete vlastní vrstvu abstrakce nad mysqli, bude to teprv porovnavatelné.

Pro mě „dobrý“ znamená jednoduchý, snadno zapamatovatelný zápis; abych nemusela každý vstup explicitně escapovat; tolerantní vstup (hodnotu pro DATE / DATETIME můžu zadat jako číslo, řetězec i DateTime instanci); užitečné pomůcky pro načtení dat přesně ve tvaru, v jakém je potřebuju. Určitě bude i něco jiného, co by mi vyhovovalo taky, ale na dibi jsem narazila nejdřív, tak už jsem dál nehledala.
final
Profil
Tori:
dnes som si to ako tak naštudoval, určite to vyzerá lepšie ako mysqli..,
mohol by som poprosiť o príklad ako by ten update vyzeral v dibi?lebo nenašiel som žiaden príklad na update viac riadkov
edit:
už mi došlo ako na to..
$num="1,2,3";
dibi::query("update messages set recipientDeleted=1 where id in($num)");

(ak by tam niečo bolo náhodou zle poprosím o opravu)
Tori
Profil
final:
asi i takhle to jde:
$ids = array(1, 2, 3);
dibi::query("update `messages` set `recipientDeleted` = %i where `id` %in", 1, $ids);
anebo

$ids = array(1, 2, 3);
$novyStav = array('recipientDeleted' => true);
dibi::query("update `messages` set ", $novyStav, "where `id` %in", $ids);
anebo
$ids = array(1, 2, 3);
$novyStav = array('recipientDeleted' => true);
dibi::update("messages", $novyStav)->where("id %in", $ids)->execute();
(viz kapitola formátování polí)


Koukněte ještě na tohle srovnání, jak vypadají tytéž dotazy v různých DB vrstvách: SQL Cross Queries
final
Profil
Ďakujem
final
Profil
mohol by som ešte poprosiť o vysvetlenie v tomto?
$result = dibi::query("select nieco1,nieco2 from table where id='1'");
$row = $result->fetchAll();
print_r($row);
//Array ( [0] => DibiRow Object ( [nieco1] => a [nieco2] => b ) ) 
Prečo to vracia v tvare $row[0]['nieco1'] a nie v tvare $row['nieco1']?
Tori
Profil
final:
fetchAll vrací všechny řádky. fetch() vrací jen první.


viz: http://phpfashion.com/dibi-pokrokovy-databazovy-layer#toc-ziskavani-vysledku, http://phpfashion.com/temer-v-cili-dibi-0-9b#toc-3-zapouzdrit-result-set-a-asistovat-pri-zpracovani
final
Profil
Tori:
ďakujem posledný krát, to už je všetko :)

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:

0