3

JavaScript/AjaxとPHPの組み合わせを使用してMySQLテーブルに文字列を挿入しようとしています。Ajaxを使用して目的の(JavaScript)文字列をPHPスクリプトに渡した後、PHPを使用してそれをテーブルに挿入しようとします。

PHPスクリプトは機能していますが、一重引用符(')が検出されるとすぐに、挿入はその時点で停止します。mysql_real_escape_string()、addslashes()、htmlentities()、str_replace()をさまざまな組み合わせで使用してみましたが、魔法の引用符をオンまたはオフにして、一重引用符を処理できません。それらを保存するか、適切にエスケープしたいのですが、何も機能していません。文字列自体はツイートからのものなので、エンコードの競合が原因である可能性がありますか?これを克服する方法についてのアドバイスをいただければ幸いです。

たとえば、わかりやすく説明するために、この文字列をPHPスクリプトに渡すと次のようになります。

投票しないと約束してください

次に、上記のいずれかの方法で文字列をサニタイズし、MySQLテーブルに挿入すると、MySQLテーブルでは常にそのように表示されます。

あなたが勝ったと約束してください

これが私のphpコードです:

include("dbconnect.php"); //connect to DB
$tweet = mysql_real_escape_string($_POST['tweet']); //escape the string

if($tweet != '') { //check it's not empty

$query = "insert into Tory (Content) values('$tweet')"; //insert statement

$link = mysql_query($query);
if (!$link) {
  echo "3";
  die($result);
}
echo "<p>".$tweet."</p>"; //for Ajax callback
}

Javascript/Ajaxコードは次のとおりです。

$.ajax({  
    type: 'POST',  
    url: 'buildTable.php', //previous php code
    data: "tweet=" + content, //content is the tweet string as javascript var
    success: function(thetweet) {
         $(document.body).append(thetweet);
    }
});

編集:提供されたすべてのコメントとアドバイスをありがとう。私が使用した一時的な解決策は、文字列をPHPスクリプトに渡す前に、一重引用符のすべてのインスタンスをクライアント側で円記号に置き換えることです。次に、PHPまたはJavaScriptで取得するときに、一重引用符に戻します。

4

4 に答える 4

3

mysql で一重引用符 ( ') または二重引用符 ( ) を使用して文字列を挿入する"

addslashes();挿入時およびstripslashes();データのフェッチにのみ使用します。

$str = "Hello Friend's.. Hows you all"s.";
// Outputs: Hello Friend\'s..Hows you all\"s.
echo addslashes($str);

stripslashes — で引用された文字列を引用解除しaddslashes()ます。バックスラッシュを取り除いた文字列を返します。(\'となり'ます。) 2 つのバックスラッシュ ( \\) は 1 つのバックスラッシュ ( \) になります。

$str = "Hello Friend\'s.. Hows you all"s."; // Outputs: Hello Friend's.. Hows you all"s.
echo stripslashes($str);

ここで本題に入ります。次のように、一重引用符または二重引用符で文字列をデータベースに挿入すると、次のようになります。

$str = “Hello Friend's.. Hows you all"s.”;
$query = “INSERT INTO tbl (description) VALUES (‘$str’)”;

これはエラーになりますが、addslashes($str)以下のような関数を使用してデータベースに挿入すると、エラーは発生しません。

$str = “Hello Friend's.. Hows you all"s.”;
$desc_str = addslashes($str);
$query = “INSERT INTO tbl (description) VALUES (‘$desc_str’)”;

同様にstripslashes($str)、次のようにそのテーブル フィールド値を出力するために使用できます。

echo stripslashes($str);
于 2014-12-10T12:37:29.937 に答える
2

準備済みステートメントでmysqli またはPDOを使用すると、エスケープ全体を簡単に回避できます。mysql_*とにかく関数は非推奨なので、これは切り替える絶好の機会です。

コードは次のようになります (PDO、コードを使用):

$query = "insert into Tory (Content) values (:tweet)";
$stmt = $db->prepare($sql);    // $db being your PDO object
$stmt->execute(array(':tweet' => $_POST['tweet']));    // assuming you are not verifying the tweet somewhere else
于 2012-07-03T01:36:46.113 に答える
0

これが適切かどうかはわかりません。少し遅れていることはわかっていますが、CSVファイルを作成しようとしたときに同様の問題が発生しています。一重引用符がエスケープされなかった理由がわかりませんでした。

解決

私のスリングの単一引用符はスマート引用符でした。つまり、ストレート引用符ではなくカーリー引用符でした。

以下の関数を実行した後(Chris Shiflettのおかげで)、見積もりが変換され、エスケープの問題が解決されました。

この関数を介して格納される各フィールド/セル値/列値を渡して、中引用符やemdashなどのスマート文字を一重引用符やハイフンなどのHTMLエンティティに変換します

$smart_string = "String containing smart quotes";
$safe_string = convert_smart_quotes($smart_string);

function convert_smart_quotes($string) 
{ 
    $search = array(chr(145), 
                    chr(146), 
                    chr(147), 
                    chr(148), 
                    chr(151)); 

    $replace = array("'", 
                     "'", 
                     '"', 
                     '"', 
                     '-'); 

    //return string with smart characters replaced by html safe characters
    return str_replace($search, $replace, $string); 
}

私が言ったように、これがあなたの問題に直接役立つかどうかはわかりませんが、将来あなたや他の人を助けるかもしれません!

于 2012-07-24T10:00:47.520 に答える
0

交換:

$link = mysql_query($query);
if (!$link) {
  echo "3";
  die($result);
}

と:

mysql_query($query);
if(mysql_errno() != 0)
  die(mysql_error());
于 2012-07-02T16:15:42.757 に答える