2017-04-25 14 views
0

引用符と二重引用符の両方を含むテーブルにデータを挿入しようとしています。どのように私はそれらを逃れることができますか?Mysql引用符と二重引用符を使用したPHPの挿入

私は追加したい値は次のとおりです。

default=1,name='Bob',lastName="Jones" 


$ins = "INSERT into table (field1,field2,fiel3,) values ('data1','data2',????)"; 

私は単一引用符を使用する場合は、ボブの一部が壊れて取得します。二重引用符を使用すると、ジョーンズ部分が壊れてしまいます。

私はmysql_escape_stringを使用していますが、これはどのように見えますか?

$data3 = mysql_escape_string(????); 

また、一重引用符を使用すると、Bob部分が壊れてしまいます。二重引用符を使用すると、ジョーンズ部分が壊れてしまいます。

私はそのひどいDBデザインを知っていますが、私は追加する必要のあるフィールドや値の構文を制御することはできません。私は上記のように正確に値を挿入する必要があります。

+0

私はあなたがそれをやってみたいと思います理由として、単に好奇心が強いです。 –

+6

**警告**:PHPを習得しているだけの方は、古い[mysql_query'](http://php.net/manual/en/function.mysql-query.php)インタフェースを学ばないでください。それはひどいので、PHP 7では削除されました。[PDOは学ぶのが難しくありません](http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo- for database-access /)、[PHP The Right Way](http://www.phptherightway.com/)のようなガイドはベストプラクティスの説明に役立ちます。あなたのユーザーパラメータは[正しくエスケープされています](http:// bobby-tables。com/php)、あなたは重大な[SQLインジェクションのバグ](http://bobby-tables.com/)に終わるでしょう。 – tadman

+0

@ Fred-ii-データを追加しているdbはピエロによって設計されているので....良いdbはフィールド3を個々のフィールドに区切りますが、このデータベースではありません..... – bart2puck

答えて

2

準備文を使用する

これを見てください。

まず改善mysqli$mysqliがあなたのコネクタです

$mysqli = new mysqli($servername, $username, $password); 

$stmt = $mysqli->prepare("INSERT into table (field1,field2,fiel3,) values (?,?,?)"); 
$stmt->bind_param("sss",$data1,$data2,$data3); 
$stmt->execute(); 

と接続します。

このようにしても、SQLインジェクションを防ぐことができます。

+0

グレートたとえば、まさにそれは 'mysqli'で行われるべきか。 – tadman

+0

うん!レム編集今、彼は全体のソリューションを持って、そこコネクタ –

+2

を表示する。 –

2

mysql_*関数はPHP 7以降では廃止されました。引用符で囲まれていないとわかっているからです。少なくとも適切ではない。異なるデータベースタイプと互換性があるので、PDOに行くことをお勧めします。私の意見では、mysqli_*機能よりも使いやすいと思います。 mysqliは引用符をエスケープできることをお知らせしますが、

mysqliの例との答えがすでにあるので、ここでは引用符をエスケープするためにPDOを使用しての簡単な例です:

$dns = "mysql:dbname=test;host=localhost"; 
$user = "root"; 
$password = ""; 

$connection = new PDO($dns, $user, $password); 

$sql = "INSERT INTO users (username, password) VALUES (:username, :password)"; 
$statement = $connection->prepare($sql); 
$statement->execute([ 
    ':username' => $username, 
    ':password' => $password 
]); 

は今、これが唯一の引用符をエスケープし、それはあなたの入力をフィルタリングしない覚えています。したがって、外部データ(フォームデータ)を挿入する前に、$string = filter_var($string, FILTER_SANITIZE_STRING)のように、フィルタリングする内容に基づいてfilter_var()関数を使用してください。それとも、何ができる:オリジナルmysql_real_escape_stringのを模倣するが、アクティブなMySQLの接続は必要ありません

$statement->bindParam(':username', $username, PDO_PARAM_STRING); 
0

ほんの少しの機能を。データベースクラス内の静的関数として実装できます。誰かを助けることを願っています。

<?php 

function mysql_escape_mimic($inp) { 

    if(is_array($inp)) 
     return array_map(__METHOD__, $inp); 

    if(!empty($inp) && is_string($inp)) { 
     return str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $inp); 
    } 

    return $inp; 
} 
?> 

出典:php manual

関連する問題