4

検索結果をjsonとして返すAPIを使用しています。次に、これをMYSQLテーブルに書き込む必要があります。以前はこれを正常に実行しましたが、今回は状況が異なります。これは、結果の配列の構造によるものだと思います。キー名は動的であり、特定のキーのデータが存在しない場合、キーは動的ではありません。配列にリストされています。配列のvardumpの例を次に示します。

array
  0 => 
    array
      'title' => string 'Funny but not funny' (length=19)
      'body' => string 'by Daniel Doi-yesterday while eating at Curry House...
      'url' => string 'http://danieldoi.com/2012/11/20/funny-but-not-funny/' 
      'source_site_name' => string 'WordPress.com' (length=13)
      'source_site_url' => string 'http://www.wordpress.com' (length=24)
      'query_topic' => string 'thanksgiving' (length=12)
      'query_string' => string 'blogs=on&topic=thanksgiving&output=json' (length=39)
  1 => 
    array
      'title' => string 'Travel Easy this Holiday Season...' (length=34)
      'body' => string 'Give yourself a few gifts and get this holiday season off...
      'url' => string 'http://facadebeauty.wordpress.com/2012/11/20
      'date_published' => string 'Tue, 20 Nov 2012 18:22:35 +0000' (length=31)
      'date_published_stamp' => string '1353435755' (length=10)

キーの順序/包含がどのように変更される可能性があるかに注意してください。

私が提案した解決策は、配列キーを列名として使用し、それらを変数に変換してクエリステートメントで使用することでしたが、これはうまくいきません。これが私の試みです:

$jsonString = file_get_contents("http://search-query-URL&output=json");
$array = json_decode($jsonString, true);

// database connection code snipped out here

$table = "results";

foreach($array as $arr_value) {
        foreach ($arr_value as $value) {
          $colName = key($arr_value);
          $colValue = ($value);
          $insert="INSERT INTO $table ($colName) VALUES ('$colValue')";

          mysql_query($insert) OR die(mysql_error());
          next($arr_value);
              }
         }

次にどこを見るべきかについての提案はありますか?ありがとうございました!

更新11/27:

ここで私はDavidの提案を適応させようとしています。次のエラーが表示されます:「データベース接続エラー(1110)列'title'がクエリで2回指定されました。」

これが現在の私のコードです:

$mysqli = mysqli_connect("localhost");
mysqli_select_db($mysqli, "mydatabase");

foreach ($array as $column) {
    foreach ($column as $key => $value) {
    $cols[] = $key;
    $vals[] = mysqli_real_escape_string($mysqli, $value);
    }
}

$colnames = "`".implode("`, `", $cols)."`";
$colvals = "'".implode("', '", $vals)."'";
$mysql = mysqli_query($mysqli, "INSERT INTO $table ($colnames) VALUES ($colvals)") or die('Database Connection Error ('.mysqli_errno($mysqli).') '.mysqli_error($mysqli). " on query: INSERT INTO $table ($colnames) VALUES ($colvals)");
mysqli_close($mysqli);
if ($mysql)
return TRUE;
else return FALSE;

Final Upate-WORKING!

動作しています。これが私たちが持っているものです:

$mysqli = mysqli_connect("localhost");
mysqli_select_db($mysqli, "mydatabase");
  foreach ($array as $column) {
foreach ($column as $key => $value) {
    $cols[] = $key;
    $vals[] = mysqli_real_escape_string($mysqli, $value);
    }
  $colnames = "`".implode("`, `", $cols)."`";
  $colvals = "'".implode("', '", $vals)."'";
  $mysql = mysqli_query($mysqli, "INSERT INTO $table ($colnames) VALUES ($colvals)") or die('Database Connection Error ('.mysqli_errno($mysqli).') '.mysqli_error($mysqli). " on query: INSERT INTO $table ($colnames) VALUES ($colvals)");

  unset($cols, $vals);
}
  mysqli_close($mysqli);
if ($mysql)
return TRUE;
else return FALSE;  
4

3 に答える 3

5

私は常にこの機能を使用しているため、実際にはこの機能だけを使用しています。これが行うこと: テーブルに挿入するために配列内のすべての連想ペアをプールし、それらを単一の挿入として配置します。明確にするために、これは上記で行っていることではありません。各値を独自の挿入に挿入しようとしているように見えるため、必要以上の行が得られる可能性があります。

function mysqli_insert($table, $assoc) {
    $mysqli = mysqli_connect(PUT YOUR DB CREDENTIALS HERE);
    mysqli_select_db($mysqli, DATABASE NAME HERE);
    foreach ($assoc as $column => $value) {
        $cols[] = $column;
        $vals[] = mysqli_real_escape_string($mysqli, $value);
    }
    $colnames = "`".implode("`, `", $cols)."`";
    $colvals = "'".implode("', '", $vals)."'";
    $mysql = mysqli_query($mysqli, "INSERT INTO $table ($colnames) VALUES ($colvals)") or die('Database Connection Error ('.mysqli_errno($mysqli).') '.mysqli_error($mysqli). " on query: INSERT INTO $table ($colnames) VALUES ($colvals)");
    mysqli_close($mysqli);
    if ($mysql)
        return TRUE;
    else return FALSE;
}

MarcB が上で述べているように、ターゲット テーブルに結果が示す列がないというリスクがあります。ただし、挿入を ( で) サニタイズしているmysqli_real_escape_stringため、インジェクションの脆弱性の問題は発生しません。

于 2012-11-20T18:47:05.860 に答える
1

ここにワンライナーがあります:

$query = 'INSERT INTO '.$table.'(`'.implode('`, `', array_keys($array)).'`) VALUES("'.implode('", "', $array).'")';
于 2013-03-29T17:02:11.520 に答える
0

上に回答が投稿されていることに気づきましたが、すでにこれを書いているので、投稿すると思いました。注: データの取得元を信頼していただければ幸いです。そうしないと、あらゆる種類の問題が発生します。また、コード全体にコメントを追加しました。うまくいけば、それがどのように行われているかを理解するのに役立ちます。

$jsonString = file_get_contents("http://search-query-URL&output=json");
$array = json_decode($jsonString, true);

// database connection code snipped out here

$table = "results";

foreach($array as $sub_array) {
    // First, grab all keys and values in separate arrays
    $array_keys = array_keys($sub_array);
    $array_values = array_values($sub_array);

    // Build a list of keys which we'll insert as string in the sql query
    $sql_key_list = array();
    foreach ($array_keys as $key){
        $sql_key_list[] = "`$key`";
    }
    $sql_key_list = implode(',', $sql_key_list);

    // Build a list of values which we'll insert as string in the sql query
    $sql_value_list = array();
    foreach ($array_values as $value){
        $value = mysql_real_escape_string($value);
        $sql_value_list[] = "'$value'";
    }
    $sql_value_list = implode(',', $sql_value_list);

    // Build the query
    $insert = "INSERT INTO $table ($sql_key_list) VALUES ($sql_value_list)";
    mysql_query($insert) or die(mysql_error());
}
于 2012-11-20T18:54:10.480 に答える