Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
idc
Člen
Avatar
idc:16.11.2013 14:11

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 Hartinger
Vlastník
Avatar
Odpovídá na idc
David Hartinger:16.11.2013 14:24

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
You are the greatest project you will ever work on.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na idc
David Hartinger:16.11.2013 14:25

Ještě můžeš použít gettype: http://us2.php.net/gettype

Nahoru Odpovědět
16.11.2013 14:25
You are the greatest project you will ever work on.
Avatar
idc
Člen
Avatar
idc:16.11.2013 14:39

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
Tvůrce
Avatar
Odpovídá na idc
Kit:16.11.2013 14:43

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
16.11.2013 14:43
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na idc
David Hartinger:16.11.2013 14:44

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
You are the greatest project you will ever work on.
Avatar
idc
Člen
Avatar
idc:16.11.2013 14:46
<?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:16.11.2013 14:48

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
16.11.2013 14:48
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na idc
David Hartinger:16.11.2013 14:50

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
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na idc
Kit:16.11.2013 15:05

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
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:16.11.2013 15:09

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

 
Nahoru Odpovědět
16.11.2013 15:09
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na idc
David Hartinger:16.11.2013 20:13

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
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:16.11.2013 22:19

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.