2012-07-12 7 views
26

mysqliを使用してdb内の単一の値を配列に配置することなくチェックする関数を記述しようとしています。私はすでにここで何をしているのですか?単一値Mysqli

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

答えて

20

MySQL拡張は、この使用してmysql_resultを行うことができますが、mysqliのは、私の知る限り、今日のようには同等の機能を持っていません。常に配列を返します。私はちょうどレコードを作成しなかった場合

、私はそれをこのように実行します。

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

をまたは私はちょうどレコードを作成しなかったし、ユーザーID列がAIであれば、私が行います

$userID = mysqli_insert_id($link); 
+2

または変更'して、あなたが行うことができますが、 '$のgetIdは、[0]' – rybo111

+1

誰も、誰もが、誰も気にしない、この念願の「ワンライナー」の唯一の意味の一部目に見える画面をはるかに超えています... –

+0

fetch_object()は、この答えの前に何年も存在していたので、単純なオブジェクトを返すので、mysqliには良いオプションがありました。また、あなたの答えは手続きコマンドで書かれていますが、OPの質問はオブジェクトベースのmysqliを使って書かれています。 – skrilled

5

接続を開始時に1回作成し、最後に閉じるのが最適です。あなたの機能を実装する方法は次のとおりです。

$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] : ""; 
} 
+0

はMYSQLI_NUM定数ですか? – Gokigooooks

+0

はい、そうです。 http://stackoverflow.com/questions/1684993/what-does-mysqli-num-mean-and-do php.netから、 "このオプションのパラメータは、現在の配列からどのタイプの配列を生成するかを示す定数ですこのパラメータに指定できる値は、定数MYSQLI_ASSOC、MYSQLI_NUM、またはMYSQLI_BOTHです。 – jbrahy

+1

この回答と、Johnとrybo111のより最近の回答は、OPのコードに直接対応する唯一の回答です。 OPの質問には、スカラーを返す問合せを受け入れるメソッドが示されています。返されるフィールドの名前を知る必要はありません。 – ToolmakerSteve

-1

このような何か試してみてください:ここで乾杯

+1

これは、返されるスカラーに既知のフィールド名があることを前提としています。これは、OPのコードと一貫していません。これはANYクエリを渡します(単一の値を返すと予想されます; "スカラー"クエリ)。それは、レコードフィールドの問い合わせではないかもしれません。カウントを返すことも、システム変数さえ返すこともできます。 – ToolmakerSteve

4

は私がなってしまったものだ

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

を:

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'"); 
+0

これはうまくいかないでしょう。 –

+0

@ YourCommonSenseあなたの否定は私のモチベーションです。一定。 – rybo111

+0

マイナーな問題:クエリに 'LIMIT'ではなく' limit'(小文字)を含めることができます。だから、 'LIMIT'を含む答えの部分を使うなら、テストをしたいかもしれません。if(strpos($ sql、 'LIMIT')=== false && strpos($ sql、 'limit')=== false ){' – ToolmakerSteve

1

実装には多くの欠陥がありますが(!繰り返さのみ接続)だけでなく、他の回答では、

このような機能は、それ以外の場合は、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; 
+0

あなたは一貫した関数を書くことができないだけでなく、他の答えを読むことさえできません: –

20

、私はここで私は、このような割り当てに使用するために使用される非常に簡単な方法が表示されません1つではなく、配列を完全に使用することを避けることができます。詳細については、PHP関数list()を参照してください。

+2

あなたのコードが問題を解決する理由を説明してください。 [回答]を参照してください。 – brasofilo

+4

これは、mysqliの結果値を取得するための最短のコード行です。 –

+0

これは、返されるスカラーに既知のフィールド名があることを前提としています。これは、OPのコードと一貫していません。これはANYクエリを渡します(単一の値を返すと予想されます; "スカラー"クエリ)。それは、レコードフィールドの問い合わせではないかもしれません。カウントを返すことも、システム変数さえ返すこともできます。 – ToolmakerSteve

2

でも、これは古い話題でどのように

0

これはアレイを完全に回避するわけではありませんが、1行で省略します。

function getval($query) { 
    $mysqli = new mysqli(); 
    $mysqli->connect(HOST, USER, PASS, DB); 
    return $mysqli->query($query)->fetch_row()[0]; 
} 
array` `へassoc`
関連する問題