実装には多くの欠陥がありますが(!繰り返さのみ接続)だけでなく、他の回答では、
このような機能は、それ以外の場合は、horribly insecureになりますプリペアドステートメント
のサポートを持っている必要があります。基本的なものがあります。
したがって、そのような関数を呼び出すのみ許容される方法は、実際のデータを別々に添加する必要がありながら$query
は、のみプレースホルダを含有させる
$name = getVal($query, $param1, $param2);
又は
$name = getVal($query, [$param1, $param2]);
あろう。ここに投稿された他のすべての回答を含む他のバリアントは、で使用しないでください。
getRow()
,getAll()
のような種類の他の機能が必要であると仮定すると、これらをすべてクラス内で組み合わせることは論理的です。 mysqliのためにあなたは私のsafeMysql wrapperを使用することができます。
$name = $db->getOne("SELECT name FROM users WHERE id = ?i", $id);
あなたが見ることができるように、それは非常に簡潔な構文と完全に安全があります。
サードパーティ製のラッパーを使用したくない場合は、mysqliベースの実装でのコード量がになりますので、PDOをバッキングAPIとして使用することを強くお勧めします。
function getVal($sql, $values = array())
{
global $mysqli;
$stm = $mysqli->prepare($sql);
if ($values)
{
$types = str_repeat("s", count($values));
if (strnatcmp(phpversion(),'5.3') >= 0)
{
$bind = array();
foreach($values as $key => $val)
{
$bind[$key] = &$values[$key];
}
} else {
$bind = $values;
}
array_unshift($bind, $types);
call_user_func_array(array($stm, 'bind_param'), $bind);
}
$stm->execute();
$stm->bind_result($ret);
$stm->fetch();
return $ret;
}
そして、もう一つ使用してPDO::ただ、これらの2つの機能を比較し、1はmysqliの使用
function getVal($query, $params = array())
{
global $pdo;
$stmt = $pdo->prepare($query);
$stmt->execute($params);
return $stmt->fetchColumn();
}
を、あなたは違いをはっきり見ることができます。他のすべての変異体は、セキュリティ、可読性、エラー処理とに欠ける一方で、それは、このような関数を呼び出すだけで、適切かつ安全な方法だと
いずれかの方法で、あなたはこの
$name = getVal("SELECT name FROM users WHERE id = ?", [$id]);
のように、この機能を使用して終わるだろう正気。あなたが直接、複数の変数を割り当てることができ
list($value) = $mysqli->fetch_array;
約
$name = $mysqli->query("SELECT name FROM contacts WHERE id = 5")->fetch_object()->name;
または変更'して、あなたが行うことができますが、 '$のgetIdは、[0]' – rybo111
誰も、誰もが、誰も気にしない、この念願の「ワンライナー」の唯一の意味の一部目に見える画面をはるかに超えています... –
fetch_object()は、この答えの前に何年も存在していたので、単純なオブジェクトを返すので、mysqliには良いオプションがありました。また、あなたの答えは手続きコマンドで書かれていますが、OPの質問はオブジェクトベースのmysqliを使って書かれています。 – skrilled