0

これは興味深いことであり、信じられないほど苛立たしいことです。

このデータを ajax 呼び出しを介して php ファイルに渡しています。{"html":"<div>I'm a div!!</div>"}

この次のステートメントの前に、json をデータベースに保存しない理由は理解していますが、ここでは用途があると述べたいと思います。

このデータをデータベース フィールドに保存すると、フィールドは空になります。これを見てください:

$in1 = file_get_contents('php://input'); //from ajax
var_dump($in1);
$in2 = '{"html":"<div>I\'m a div!!</div>"}';
var_dump($in2);

私のajax呼び出しの値:

string(33) "{"html":"<div>I'm a div!!</div>"}"
string(33) "{"html":"<div>I'm a div!!</div>"}"

まったく同じ!それでも、$in2問題なくデータベースに保存されます!! while$in1は空のフィールドを生成します!!

確かに、これを考慮してください:

if ($in1 === $in2) { echo "They're equal!"; }

考えてみてください...それらはまったく同じですが、一方は正しく保存され、もう一方は保存されません。すばらしい。

さらに:mysqliにはこの問題がないため、PDO の問題に絞り込むことができます。

$query = "UPDATE plugin_instances SET config=(?) WHERE id=2";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("s", $in1);
$stmt->execute(); //correct value in the db!!

すべてを削除しました。これがphpファイル全体です。

非作業出力 作業出力

これら 2 つの唯一の違いは、 の結果です$stmt->rowCount()。フィールドを正しく更新するサンプルは、フィールドint(0)を空にするものはint(1).

$db = new PDO('mysql:host=localhost;dbname=disarray', 'root', 'temp');
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
var_dump($db);

$params = [':foo'=>'{"html":"<div>I\'m a div!!</div>"}'];
var_dump($params);
$params = [':foo'=>file_get_contents('php://input')];
var_dump($params);

$query = "UPDATE plugin_instances SET config=:foo WHERE id=2";
var_dump($query);

try {
  $stmt = $db->prepare($query);
  var_dump($stmt);
  $stmt->execute($params);
  var_dump($stmt);
  var_dump($stmt->rowCount());
}
  catch (PDOException $e) {
  echo $e->getMessage();
}
4

1 に答える 1