Drupal 7.54
カスタムPHP/SQLルールを使用してDrupalフィールド値を外部データベースと同期しています。
テキストフィールドの値をエクスポートしようとしていますが、これらの値に単一引用符が含まれていることがあります。
したがって、SQLクエリでフィールドトークンを使用しようとすると、エスケープされていないこの単一引用符が原因で失敗します。
文字列の置換と引用符のエスケープについていくつか読んだことがありますが、クエリを正常に機能させることができませんでした(置換?str_replace?addlashes?htmlspecialchars?decode_entities?...)。
次に例を示します。
コンテンツタイプAにDrupalフィールド "Text-Drupal"があるとしましょう。
タイプAのコンテンツが更新されるたびに、外部データベースのtext_database列にText-Drupal値をエクスポートする必要があります
小さなコード:
db_set_active('database_local');
db_query("UPDATE table
SET text_database=NULLIF('[node:field-text-drupal]','')
WHERE title=[node:title]");
db_set_active();
このコードは、特殊文字のないテキストで正常に機能しますが、単一引用符があるたびに失敗します(二重引用符でも同じだと思います)。
経験豊富なユーザーにとってこれは本当に簡単なことだと確信しているので、誰かが私を正しい方向に向けてくれることを願っています。ありがとう。
免責事項:PHPフィルターモジュールを使用するべきではありません。これは非常に悪い習慣であり、セキュリティホールまでサイトを開く可能性があります。カスタムルールアクションの追加は非常に簡単であり、常にこのようなものの推奨される実装方法である必要があります。
ただし、技術的な演習として、次のようなものが機能する場合があります。
$text = <<<EOF
[node:field-text-drupal]
EOF;
$title = <<<EOF
[node:title]
EOF;
$args = [':text' => $text, ':title' => $title];
$sql = "UPDATE table SET text_database = NULLIF(:text, '') WHERE title = :title";
db_query($sql, $args);
これは、単一引用符の問題なしに長いテキストトークンを外部データベースに送信するための私の独自のソリューションです。
$token="[node:field-text-drupal]";
$token_clean=addslashes($token);
db_set_active('database_local');
db_query("UPDATE table
SET text_database=NULLIF('$token_clean','')
WHERE title=[node:title]");
db_set_active();
追加スラッシュを使用すると、トークンの値にクエリを妨げることなく引用符を含めることができ、データベースは正しい値を表示します。