web-dev-qa-db-ja.com

フォームデータにmysqli_real_escape string()またはmysql_real_escape_string()を使用する必要がありますか?

可能性のある複製:
mysql_escape_string VS mysql_real_escape_string

私はmysqlデータベースに入力されたcompany_name(フォームからユーザーが指定)を取得する必要があります。私が使うとき

$company = mysqli_real_escape_string($_POST['company_name'])

エラーが出る

Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in     /opt/lampp/htdocs/Abacus-Version-2/admin/Company/insert_company.php on line 58

しかし、使用中にすべてがうまくいくようです

$company = mysql_real_escape_string($_POST['company_name'])

そのような場合、私は何ができますか?

11
user1629766

どちらを使用するかは、MySQLi拡張機能を使用しているか、MySQL拡張機能を使用しているかによって異なります。

// procedural mysqli 
$db = new mysqli; 
$sql = sprintf("INSERT INTO table (id,name,email,comment) VALUES (NULL,'%s','%s','%s')", 
   mysqli_real_escape_string($db,$name), 
   mysqli_real_escape_string($db,$email), 
   mysqli_real_escape_string($db,$comment) ); 

// mysql 
$conn = mysql_connect(); 
$sql = sprintf("INSERT INTO table (id,name,email,comment) VALUES (NULL,'%s','%s','%s')", 
   mysql_real_escape_string($name,$conn), 
   mysql_real_escape_string($email,$conn), 
   mysql_real_escape_string($comment,$conn) );  
12
Anshu

mysql_real_escape_string()は、データをエラーなくデータベースに安全に挿入できるように設計されています。 (つまり、コードを壊さないようにスラッシュをエスケープするなど)。

接続文字列と一致させるには、mysql_またはmysqli_関数を使用する必要があります。 「mysqli」は、mysqlの一連の関数のオブジェクト指向実装であるため、関数はオブジェクト指向スタイルで呼び出されます。 「mysql」は手続き型です。将来のバージョンで「mysql」機能を廃止する話があると思うので、「mysqli」に変更することをお勧めします。

接続文字列が次の場合:

mysql_connect()

次に使用します:

mysql_real_escape_string($_POST[''])

もしそれが:

$mysqli = new mysqli();

次に使用します:

$mysqli->real_escape_string($_POST[''])
10
Luke

間違いなく

どちらの関数もフォームデータとは関係ありません。
これらは、フォーマットに使用する必要があります文字列リテラル SQLクエリに挿入のみ
この関数はSQLクエリに属しており、どのような形式にも属していません。そして、クエリの非常に限られた部分でさえ、文字列リテラルです。

したがって、クエリに文字列リテラル(率直に言って、引用符で囲まれたデータの一部)を挿入するたびに、この関数を無条件で使用する必要があります。
それ以外の場合は、使用しないでください。

あなたが得ているエラーに関して-それはかなり自明です:この関数は1つではなく2つのパラメータを期待します。この関数のマニュアルページに記載されているように適切なパラメータを渡すだけで、大丈夫です

4

どちらのバリアントも問題ありません*(私のアップデートをご覧ください)。

_mysql_connect_を使用している場合は、mysql_real_escape_string()を使用し、接続ハンドルも渡す必要があります。

_mysqli_connect_を使用している場合は、mysqli_real_escape_string()を使用する必要があります。

[〜#〜]更新[〜#〜]

コメントでジェフリーが指摘したように、_mysql__関数の使用は[〜#〜] [〜#〜]で問題ありません。私はそれに同意します。私が指摘したのは、使用しているMySQL拡張機能で使用される関数を使用する必要があることです。

どのMySQL拡張機能を使用するかではなく、データをエスケープするためにどの機能を使用するかという問題ではないかと思いました。

もしあなたが私に尋ねるなら:

  • mysqliは推奨されておらず非推奨であるため、PDOまたはmysqlを使用します。
  • 接続ハンドルをエスケープ関数以上に渡す
  • 準備済みステートメントPDO-Style )を使用
0
Stefan

すべてのMySQL拡張機能が 非推奨 になっているため、代わりにMySQLiメソッドを使用するのが最善です。

0
Oldskool

手続き型のスタイルを使用する場合は、次のようになります。

$city = mysqli_real_escape_string($link, $city);

ここでリンクは接続です

または、オブジェクト指向スタイルを使用する場合は、次のようになります。

$city = $mysqli->real_escape_string($city);

PHPマニュアルを確認してください: http://php.net/manual/en/mysqli.real-escape-string.php

0
Perry