12

重複の可能性:
mysql_escape_string VS mysql_real_escape_string

company_name (フォームを介してユーザーが指定) を mysql データベースに入力する必要があります。私が使うとき

$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'])

このような場合、どうすればよいですか?

4

6 に答える 6

14

どちらを使用するかは、拡張機能を使用している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) );  
于 2013-01-03T09:23:00.663 に答える
10

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

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

接続文字列が次の場合:

mysql_connect()

次に使用します:

mysql_real_escape_string($_POST[''])

もしそれが:

$mysqli = new mysqli();

次に使用します:

$mysqli->real_escape_string($_POST[''])
于 2013-01-03T09:19:21.457 に答える
3

絶対にありません

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

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

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

于 2013-01-03T09:22:01.070 に答える
1

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

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

ここで、リンクは接続です

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

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

phpマニュアルをチェックしてください:http: //php.net/manual/en/mysqli.real-escape-string.php

于 2013-01-03T09:21:30.160 に答える
0

すべてのMySQL拡張機能は非推奨になっているため、代わりにメソッドを使用することをお勧めしますMySQLi。これは将来性があります。

于 2013-01-03T09:21:09.610 に答える
0

どちらのバリアントも問題ありません* (私の更新情報をご覧ください)。

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

を使用している場合は、mysqli_connectに固執する必要がありますmysqli_real_escape_string()

アップデート

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

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

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

  • mysqliまたはを使用してください。推奨されず、非推奨PDOであるためです。mysql
  • 接続ハンドルをエスケープ関数またはそれ以上に渡す
  • 準備済みステートメントを使用する( PDO スタイル)
于 2013-01-03T09:18:23.267 に答える