Diskuze: bind_param s polem

PHP PHP bind_param s polem American English version English version

Avatar
idc
Člen
Avatar
idc:

Ahoj, mám jednoduchý SQL dotaz, kde bych pomocí parametrů chtěl volat jednotlivé hodnoty z pole, avšak nevím, jak předat pole do funkce bind_param, která přijímá jako první argument datové typy a druhý argument dané hodnoty. Chtěl bych udělat něco takového:

<?php
$mysqli = new mysqli('localhost', 'uzivatel', 'heslo', 'databaze');
$dataType = "is";
$param = array(4, 'klingoni');
$query = "INSERT INTO people(ID, hodnota) VALUES(?,?)";
if ($stmt = $mysqli->prepare($query)) {
//zde chci volat bind_param na pole $param s $dataType
        $stmt->execute();
}
?>

btw: Vím, že bych mohl mít ID jako auto_incement, jde jen o ukázku.
Děkuji za pomoc.

 
Odpovědět 16.11.2013 14:11
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na idc
David Čápka:

Projedeš jednoduše pole params foreach cyklem a jednotlivé parametry nabinduješ. Datový typ si naifuj pomocí funkcí is_integer() a podobně.

Nahoru Odpovědět 16.11.2013 14:24
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Nahoru Odpovědět 16.11.2013 14:25
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
idc
Člen
Avatar
idc:

Pokud to udělám jak jsi psal, tak mi to hodí chybu:
mysqli_stmt::bin­d_param(): Number of variables doesn't match number of parameters in prepared statement

if ($stmt = $mysqli->prepare($query)) {
        foreach ($param as $p) {
                $stmt->bind_param("s", $p);
        }
        $stmt->execute();
}

Vytvočil jsem si novou tabulku s typy string, abych teď nemusel řešit gettype.

 
Nahoru Odpovědět 16.11.2013 14:39
Avatar
Kit
Redaktor
Avatar
Odpovídá na idc
Kit:

Tady máš příklad použití:
http://www.php.net/…nd-param.php#…

Chtěl jsem to vyzkoušet, ale nemám MySQLi nainstalováno, protože používám PDO.

Nahoru Odpovědět  +1 16.11.2013 14:43
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na idc
David Čápka:

A souhlasí ti určitě počet otazníků s počtem proměnných v poli? Co jsi poslal by mělo fungovat. Můžeš to poslat celé?

Nahoru Odpovědět 16.11.2013 14:44
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
idc
Člen
Avatar
idc:
<?php
$mysqli = new mysqli('localhost', 'root', 'pass123', 'argueplus');
$param = array("vulkanci", "klingoni");
$query = "INSERT INTO tabulka(sloupec1, sloupec2) VALUES(?,?)";
if ($stmt = $mysqli->prepare($query)) {
        foreach ($param as $p) {
                $stmt->bind_param("s", $p);
        }
        $stmt->execute();
}
?>
 
Nahoru Odpovědět 16.11.2013 14:46
Avatar
idc
Člen
Avatar
idc:

Kit
Koukal jsem, že přes PDO je to jednoduší no :)
Na to jsem již koukal, ale nějak jsem si s tím neporadil, protože do:

call_user_func_array('mysqli_stmt_bind_param', array_merge (array($sql_stmt, $type), $param);

Neumím před své parametry.

 
Nahoru Odpovědět  +1 16.11.2013 14:48
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na idc
David Čápka:

Tak to nevím, chybu tam nevidím a také používám jen PDO, mimochodem, tohle všechno dělá samo.

Nahoru Odpovědět 16.11.2013 14:50
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na idc
Kit:

Pokud máš možnost přejít na PDO, tak bych se s MySQLi vůbec nezdržoval. Tohle mi funguje:

<?php
$host = "localhost";
$user = "";
$pass = "";
$name = "test";
$options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
$db = new PDO("mysql:host=$host;dbname=$name", $user, $pass, $options);
$param = array(4, 'klingoni');
$query = "INSERT INTO people(ID, hodnota) VALUES(?, ?)";
$stmt = $db->prepare($query);
$stmt->execute($param);

foreach ($db->query("SELECT * FROM people") as $row) {
    echo "$row[ID]: $row[hodnota]\n";
}
Editováno 16.11.2013 15:07
Nahoru Odpovědět  +1 16.11.2013 15:05
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
idc
Člen
Avatar
idc:

Zkusím to tedy s PDO. Díky moc za pomoc. :)

 
Nahoru Odpovědět  +1 16.11.2013 15:09
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na idc
David Čápka:

Až budeš s PDO dělat, je nutné vypnout v nastavení ATTR_EMULATE_PRE­PARES. Jinak je to super databázový framework, MySQLi je spíše takový mezičlánek, moc nevidím důvod ho používat.

Nahoru Odpovědět 16.11.2013 20:13
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Měl jsem za to, že PDO::ATTR_EMU­LATE_PREPARES je default vypnuté nebo že se uplatní jen v případech, že to driver nepodporuje.

Nahoru Odpovědět 16.11.2013 22:19
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.