2017-07-18 27 views
2

配列に存在しないデータベース内のすべてのIDを削除する方法を解明しようとしています。私はクエリでNOT INを使用しようとしていますが、なぜ手動でmysqlに入力したときと同じようにスクリプトで実行すると動作しないのか分かりません。ここに例があります。配列に一致しないデータベース内のすべての行を削除しようとしています

mysqli_query($con, "DELETE FROM table WHERE id NOT IN ($array)"); 

$ arrayはjson apiのIDのリストです。私はCURLを使用してIDを取得し、$ arrayのIDと一致しないすべてのIDをデータベース内で削除しようとしています。 最初に別の単純なCURLスクリプトを使用してapisを掻き出し、データベースに見つかったIDを挿入します。ここでやろうとしているのは基本的にリンク/データチェッカーです。 データベース内のIDが再検査時に配列に見つからない場合は、それらを削除します。

私は上記のクエリは完璧に動作すると思っていましたが、なんらかの理由でそれはしません。クエリがスクリプトから実行されると、mysqlログにはこれで実行されたクエリが表示されます。

例:

​​

か、この私が複数の値をテストしています。

DELETE FROM table WHERE id NOT IN ('166', '253', '3324') 

そして、毎回テーブル内のすべての行が削除されます。私は本当に理解できません。なぜなら、ログから同じクエリをコピー/ペーストして手動で実行すると、完璧に機能するからです。

私はarray_column、array_map、array_searchなどの配列データをキャプチャするさまざまな方法を試していますが、最終的な結果は常に同じです。 今のところ、私は上記の2つのコードを使って2つのapiをテストしています。使用される関数は、私が見つけたいくつかのランダムなものです。

//$result is the result from CURL using json_decode 


function implode_r($g, $p) { 
    return is_array($p) ? 
      implode($g, array_map(__FUNCTION__, array_fill(0, count($p), $g), $p)) : 
      $p; 
} 

foreach ($result['data'] as $info){ 
$ids = implode_r(',', $info['id']); 
mysqli_query($con, "DELETE FROM table WHERE id NOT IN ($ids)"); 
} 

そして

$arrayLength = count($result); 
for($i = 0; $i < $arrayLength; $i++) { 
mysqli_query($con, "DELETE FROM table WHERE id NOT IN ('".$result[$i]['id']."')"); 
} 

誰もが何が起こっているかを知っている場合、私は助けたり、同じ結果を達成するためにどのように任意の提案をappretiateと思います。私はPHP 7とmysql 5.7をinnodbテーブルで使用しています。

答えて

1

何をしたいことは、この

IN('1','2','3','4') 

OR

ある場合は、あなたのINの値がこの

IN('1,2,3,4'); 

のようなものであるため、それはおそらく動作しません。

IN(1,2,3,4) 
0123破でこれを取得するには

この

$in = "'".implode("','", $array)."'"; 

NOTE直接SQLに変数を入力するたびに、このようなSQLインジェクションとして考慮すべきセキュリティ上の影響があるように引用符が含まれます。 IDが缶詰ソースからのものであれば大丈夫だと思いますが、とにかくそれらをサニタイズするのが好きです。

+0

私は自分の問題を把握しました。私はすでにあなたが言っていることをしたコードを持っていたので、もっと混乱しました。 $ res = array_map(function($ el){return $ el ['id'];}、$ result); $ str = implode( "'、'"、$ res);私がINと()の間にスペースがあったことがわかっていなかったのは、この間ずっと問題だったようです。それは、あなたがこのIN()のように書いたのを見るまで、それは問題を引き起こすだろうということは私には起こりませんでした。スペースがなくても作業は機能しているようです。ありがとう。 – Greg

+0

私はそれを調べていないのに物事が働いているのでスペースが問題を引き起こすかどうかはわかりません。 – Greg

+0

SQLでIN()とIN()の同じことは関係ありません> https://dev.mysql.com/doc/refman/5.7/en/function-resolution.htmlを参照してください – ArtisticPhoenix

1

配列と文字列を混在させることはできません。

これは動作します:

mysqli_query($con, "DELETE FROM table WHERE id NOT IN (".implode(',', $ids).")"); 
関連する問題