3

フィールド名、フィールドの数、およびそれらの値を知らなくても、PHPでMySQLiを使用してテーブルを配列で更新することは可能ですか?

キーと値のフィールドに疑問符を挿入する準備済みステートメントを試しました (?=?)。更新クエリで () VALUES () を使用できるかどうかを考えていましたが、解決策があるかもしれませんが、そのようなものは存在しないと思います。

私のスクリプトを見てください:

<?php
    class UserHandler {
        public function updateUserData($array, $id) {
            global $mysqli;
            $stmt = $mysqli->prepare("UPDATE users SET ?=? WHERE id = ?");
            $stmt->bind_param('ssi', $array[0], $array[1], $id);
            $stmt->execute();
            return true;
        }
    }

    $users = new UserHandler;
?>

使い方は次のようにしたいです。

<?php
    $users->updateUserData(array(
        'firstname' => 'Wanda',
        'lastname' => 'Merritt',
        'state' => 'IN'
        'address' => '693 Pearcy Avenue',
        'zipcode' => 46625,
    ), 45);

    $users->updateUserData(array(
        'firstname' => 'Stanley',
        'lastname' => 'Lewis',
        'password' => '123123'
    ), 159);
?>
4

6 に答える 6

1

列 => 値のペアの配列を指定して、更新/挿入クエリを実行する PDO ラッパーを作成したことがあります。ここでも同じ一般的な戦略が役立つ場合があります。

あなたがしたいことは次のようなものです:

public function updateUserData($array, $id)
{
    // Instead of a global, consider dependency injection and object properties?
    global $mysqli;

    if (empty($array)) {
        return false;
    }

    // Build the update query:
    $binding = '';
    $columns = '';
    $params = [];
    foreach ($array as $key => $value) {
        $binding .= 's';
        // Note: A whitelist is better here than escaping:
        $columns .= ' `' . preg_replace('/[^a-z_A-Z0-9]/', '', $key) . '` = ?,';
        $params []= (string) $value;
    }
    $params []= $id;

    $stmt = $mysqli->prepare(
        "UPDATE users SET " . rtrim($columns, ',') . " WHERE id = ?"
    );
    $stmt->bind_param(
        $binding . 'i', 
        ...$params
    );
    return $stmt->execute();
}

(可能な場合は、質問で提供されたコードを採用しました。個人的には、上記のラッパーで行ったように、この問題をより一般的に取り組み、抽象化を使用します。)

これはすべての文字列を想定しています。$value必要に応じて、 foreach ループでのタイプを検出して、別のタイプのプレースホルダーを指定できます。(現在サポートされている唯一のバージョンである PHP 5.6+ のみ。)

上記のサンプルでは、​​構築される文字列は次のようになります。

<?php
/*
$users->updateUserData(array(
    'firstname' => 'Wanda',
    'lastname' => 'Merritt',
    'state' => 'IN'
    'address' => '693 Pearcy Avenue',
    'zipcode' => 46625,
), 45);
*/

# Query string: 
  "UPDATE users SET  `firstname` = ?, `lastname` = ?, `state` = ?, `address` = ?, `zipcode` = ? WHERE id = ?"
# Binding:
  "sssssi"
# Parameters
  [
    'wanda',
    'Merritt',
    'IN',
    '693 Pearcy Avenue',
    '46625',
    45
  ]

その後:

/*
$users->updateUserData(array(
    'firstname' => 'Stanley',
    'lastname' => 'Lewis',
    'password' => '123123'
), 159);
*/
# Query String:
  "UPDATE users SET  `firstname` = ?, `lastname` = ?, `password` = ? WHERE id = ?"
# Binding:
  "sssi"
# Parameters:
  [
    'Stanley',
    'Lewis',
    '123123'
  ]

言うまでもありませんが、平文のパスワードを保存しないでください。

于 2016-08-19T18:20:12.107 に答える
-2
$a=array("item1"=>"object1", "item2"=>"object2");


      function update_data($a, $id)
        {
            $sql = "UPDATE Tbl_name SET ";
            $sql .= urldecode(http_build_query($a,'',', '));
            $sql .= " WHERE img_id='".$id."'";

             //echo $sql;//this is only for testing.  
}

echo update_data($a, $id);

出力は次のとおりです。UPDATE images SET item1=object1, item2=object2

于 2016-08-19T03:17:20.687 に答える
-4

そのようなことをしたい場合は、次のように配列をループします。

function updateUserData($array, $id) {
  $query = 'UPDATE `table` SET ';
  $sep = '';
  foreach($array as $key=>$value) {
    $query .= $sep.$key.' = "'.$value.'"';
    $sep = ',';
  }
  $query .= ' WHERE `id` = "'.$id.'"';
  // execute query
}
于 2013-10-03T11:06:41.483 に答える
-4

私は新しいコーダーです。これは、Mysql を配列で更新するための私のソリューションです。値が空かどうかをチェックし、mysql インジェクションから保護します。

$datas = array('column_name' => 'data');

function esemenyFeltolto(array $datas, $id){

$mysqli = getConnect();

foreach($datas as $key=>$value){

    if(!empty($value)){
         $key = $mysqli->real_escape_string($key);
         $value = $mysqli->real_escape_string($value);

         $data[] = $key.'="'.$value.'"';
         }
    }

    $query = "UPDATE table SET ".implode(',',$data)." WHERE table_id = ".$id;
    $mysqli->query($query);
}
于 2014-12-15T14:36:48.207 に答える