私は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'])
そのような場合、私は何ができますか?
どちらを使用するかは、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) );
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[''])
どちらの関数もフォームデータとは関係ありません。
これらは、フォーマットに使用する必要があります文字列リテラル SQLクエリに挿入のみ。
この関数はSQLクエリに属しており、どのような形式にも属していません。そして、クエリの非常に限られた部分でさえ、文字列リテラルです。
したがって、クエリに文字列リテラル(率直に言って、引用符で囲まれたデータの一部)を挿入するたびに、この関数を無条件で使用する必要があります。
それ以外の場合は、使用しないでください。
あなたが得ているエラーに関して-それはかなり自明です:この関数は1つではなく2つのパラメータを期待します。この関数のマニュアルページに記載されているように適切なパラメータを渡すだけで、大丈夫です
どちらのバリアントも問題ありません*(私のアップデートをご覧ください)。
_mysql_connect
_を使用している場合は、mysql_real_escape_string()
を使用し、接続ハンドルも渡す必要があります。
_mysqli_connect
_を使用している場合は、mysqli_real_escape_string()
を使用する必要があります。
[〜#〜]更新[〜#〜]
コメントでジェフリーが指摘したように、_mysql_
_関数の使用は[〜#〜] [〜#〜]で問題ありません。私はそれに同意します。私が指摘したのは、使用しているMySQL拡張機能で使用される関数を使用する必要があることです。
どのMySQL拡張機能を使用するかではなく、データをエスケープするためにどの機能を使用するかという問題ではないかと思いました。
もしあなたが私に尋ねるなら:
mysqli
は推奨されておらず非推奨であるため、PDO
またはmysql
を使用します。すべてのMySQL
拡張機能が 非推奨 になっているため、代わりにMySQLi
メソッドを使用するのが最善です。
手続き型のスタイルを使用する場合は、次のようになります。
$city = mysqli_real_escape_string($link, $city);
ここでリンクは接続です
または、オブジェクト指向スタイルを使用する場合は、次のようになります。
$city = $mysqli->real_escape_string($city);
PHPマニュアルを確認してください: http://php.net/manual/en/mysqli.real-escape-string.php