これは興味深いことであり、信じられないほど苛立たしいことです。
このデータを 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();
}