web-dev-qa-db-ja.com

単一値Mysqli

Mysqliを使用して、配列に配置せずにdbの単一の値をチェックする関数を作成しようとしています。ここですでに行っていること以外に、他に何ができますか?

function getval($query){
    $mysqli = new mysqli();
    $mysqli->connect(Host, USER, PASS, DB);
    $result = $mysqli->query($query);
    $value = $mysqli->fetch_array;
    $mysqli->close();
    return $value;
}
30
Refiking

どう?

$name = $mysqli->query("SELECT name FROM contacts WHERE id = 5")->fetch_object()->name; 
31
Mike

Mysql拡張モジュールはmysql_resultを使用してこれを行うことができますが、mysqliには今日の同等の機能はありません。常に配列を返します。

レコードを作成しなかった場合は、次のようにします。

$getID = mysqli_fetch_assoc(mysqli_query($link, "SELECT userID FROM users WHERE something = 'unique'"));
$userID = $getID['userID'];

または、レコードを作成しただけで、userID列がAIの場合、次のようにします。

$userID = mysqli_insert_id($link);
25
prl77

常に最初に接続を作成し、最後に接続を閉じることをお勧めします。以下に、関数を実装する方法を示します。

$mysqli = new mysqli();
$mysqli->connect(HOSTNAME, USERNAME, PASSWORD, DATABASE);

$value_1 = get_value($mysqli,"SELECT ID FROM Table1 LIMIT 1");
$value_2 = get_value($mysqli,"SELECT ID FROM Table2 LIMIT 1");

$mysqli->close();

function get_value($mysqli, $sql) {
    $result = $mysqli->query($sql);
    $value = $result->fetch_array(MYSQLI_NUM);
    return is_array($value) ? $value[0] : "";
}
7
jbrahy

ここに私が終わったものがあります:

function get_col($sql){
  global $db;
  if(strpos(strtoupper($sql), 'LIMIT') === false) {
    $sql .= " LIMIT 1";
  }
  $query = mysqli_query($db, $sql);
  $row = mysqli_fetch_array($query);
  return $row[0];
}

このようにして、LIMIT 1クエリで(すべて完了しました)、関数が追加します。

使用例:

$first_name = get_col("SELECT `first_name` FROM `people` WHERE `id`='123'");
4
rybo111

これは配列を完全に回避するわけではありませんが、1行で配列を省きます。

function getval($query) {
    $mysqli = new mysqli();
    $mysqli->connect(Host, USER, PASS, DB);
    return $mysqli->query($query)->fetch_row()[0];
}
3
Tom Lucas

実装には多くの欠陥があります(接続だけを繰り返します!)だけでなく、他の回答(パラメーターを画面外に移動するという犠牲を払って1ライナーですか?)

このような関数は、準備済みステートメントをサポートする必要があります

それ以外の場合は、 恐ろしく安全ではない になります。

したがって、そのような関数を呼び出す唯一の許容される方法は

_$name = getVal($query, $param1, $param2);
_

または

_$name = getVal($query, [$param1, $param2]);
_

_$query_にはプレースホルダーのみを含めることができますが、実際のデータは個別に追加する必要があります。ここに投稿された他のすべての回答を含む、他のバリアントは使用しないでください

他の種類の関数(getRow()getAll()など)が必要であるという事実を仮定すると、それらをすべてクラスに結合することは論理的です。 mysqliの場合、my safeMysql wrapper を使用できます。

_$name = $db->getOne("SELECT name FROM users WHERE id = ?i", $id);
_

ご覧のとおり、非常に簡潔な構文と完全に安全です。

サードパーティのラッパーを使用したくない場合は、mysqliベースの実装が非常に大きな量になるため、バッキングAPIとしてPDOを使用することを強くお勧めしますコード。 mysqliを使用するこれら2つの関数を比較するだけです。

_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を使用するもの:

_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]);
_

そのような関数を呼び出すための唯一の適切かつ安全な方法であるため、他のすべてのバリアントはセキュリティ、可読性、エラー処理、および健全性に欠けています。

2

これは古いトピックでもありますが、ここではそのような割り当てに使用するのに使用した非常に簡単な方法は表示されません。

list($value) = $mysqli->fetch_array;

1つだけでなく、より多くの変数を直接割り当てることができるため、配列の使用を完全に回避できます。詳細については、php関数 list() を参照してください。

2
John

次のようなものを試してください:

$last = $mysqli->query("SELECT max(id) as last FROM table")->fetch_object()->last;

乾杯

0
Mick