web-dev-qa-db-ja.com

SQLクエリで使用するためにトークンから単一引用符をエスケープする方法は?

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();

このコードは、特殊文字のないテキストで正常に機能しますが、単一引用符があるたびに失敗します(二重引用符でも同じだと思います)。

経験豊富なユーザーにとってこれは本当に簡単なことだと確信しているので、誰かが私を正しい方向に向けてくれることを願っています。ありがとう。

2
Toki

免責事項: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);
2
Clive

これは、単一引用符の問題なしに長いテキストトークンを外部データベースに送信するための私の独自のソリューションです。

     $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();

追加スラッシュを使用すると、トークンの値にクエリを妨げることなく引用符を含めることができ、データベースは正しい値を表示します。

0
Toki