0

フォームにいくつかのフィールドがあり、ユーザーが後で入力できるように単純に空白のままにしておくことができるとします。

SQLクエリに処理する前に、どのように処理しますか?

私はまだPHPにかなり慣れていません。これが私がやった方法です。

function checkVAR( $str )
{
  $val = htmlentities( $_REQUEST[$str] , ENT_QUOTES , "UTF-8" );
  if ( $val == "" )
    return "NULL";
  return "'" . $val . "'";
}

後で私のクエリで

$query = "INSERT INTO tblName ( idCol , col2 , col3 ) " .
  "VALUES (" . checkVAR('idcol') . "," . checkVAR('col2') . "," . checkVAR('col3') . ");"

私の方法はまだ非常に退屈だと思います。この種の状況を処理する他のより良い方法があるのではないかと思います。私のこの関数は数値を返すとうまくいかないので、0代わりに返すことを除いてまったく同じことをする別の関数がありましたnull

4

2 に答える 2

2

まず、データベースにデータを入力する前に HTML 文字をエンコードしないでください。そのデータを HTML 以外の表示手段で送信したい場合はどうなるでしょうか。それはおそらくゴブリディ・グックのように見えるでしょう. 少なくとも、文字列データをエスケープし、数値データ型が適切な型にキャストされるようにする必要があります。さらに良いのは、準備済みステートメントを使用することです。

古いAPI は廃止されたため、 mysqli拡張機能を適切に使用していると仮定します。改良された拡張機能を使用していますよね?右?Ok!mysql_*

function getNullOrEscaped($string)
{
    // casting ensures that we are passing a string to mysqli_real_escape_string
    // and allows us to pass objects with __toString implemented
    $string = (string) $string;
    return ($string === '') ? null : mysqli_real_escape_string($string);
}

ただし、おそらく準備済みステートメントの使用を検討します

于 2012-05-18T02:31:35.253 に答える
-1

これにより、実行した内容がより美しくなり、おそらく使いやすくなります。

関数ページ:

function check_post($var)
{
  $val = mysql_real_escape_string($_POST[$var]);
  return ($var== "") ? NULL : "'" . $var . "'";
}

フォームハンドラー:

$value = check_post($var);
$query = "INSERT INTO `table` (id, col1) VALUES (" . $value . ")";

ただし、実際には他の解決策を確認する必要があります。シンプルなデータベースORMであるIDIORM(http://j4mie.github.com/idiormandparis/)を強くお勧めします。これにより、次のように簡単に値を挿入できます。

$object = ORM::for_table("table")->create();
$object->value = check_post($var);
$object->save();
于 2012-05-18T02:20:13.007 に答える