一般的にmysqlへの接続と使用を簡単にするカスタムクラスを作成しています。多くの関数を作成しましたが、一部を除いてすべて正常に動作します。文字列が実際の文字列であるかどうか、またはそれがmysql関数であるかどうかを判断して、引用符を付けるかどうかを判断する方法を理解できないようです。2 つのパラメーターを渡すことができる関数をまとめて、データベースに挿入します。最初のパラメーターは挿入先のテーブルで、2 番目のパラメーターは列と値のペアの配列です。このコード例は、もう少し理解を深めるのに役立つかもしれません。注:私はすでにすべての文字列をエスケープしており、問題の単純さを示すためにそのコードを削除しました。
function insert($table,array $array){
$table = "`".$table."`";
$columns = "";
$values = "";
foreach($array as $key => $value){
$columns = ($columns=="") ? "`".$key."`" : $columns.", `".$key."`";
if($value===NULL || $value=="NULL"){
$value = "NULL";
} else {
$value = "'".$value."'";
}
$values = ($values=="") ? "".$value."" : $values.", ".$value."";
}
$query = "INSERT INTO $table ($columns) VALUES ($values)";
return $this->query($query);
}
以下は、2 つの異なる使用例と、それぞれの期待される結果です。
$data = array(
"first_name"=>"John",
"last_name"=>"Doe",
"entry_date"=>"2013-08-26"
);
$MyClass->insert("people",$data);
実行します
INSERT INTO `people` (`first_name`,`last_name`,`entry_date`) VALUES ('John','Doe','2013-08-26')
これは予想されますが、次の使用法:
$data = array(
"first_name"=>"John",
"last_name"=>"Doe",
"entry_date"=>"NOW()"
);
$MyClass->insert("people",$data);
として実行されます
INSERT INTO `people` (`first_name`,`last_name`,`entry_date`) VALUES ('John','Doe','NOW()')
引用符が含まれていると MySQL 関数が動作しないため、これは機能しません。キャッチされない場合、ユーザーからの機能が許可されるため、これは小さなセキュリティリスクである可能性があることを私は知っています。これを行うためのより良い方法はありますか、またはこのようなクラス挿入関数で MySQL 関数を許可しないでください。誰かが mysql 関数を見つけて許可するためにまとめた正規表現がある場合、それが解決策になる可能性があります。そのような正規表現が存在しない場合、1つの可能性は、私があまり得意ではないゼロから作成することです...
編集:
当面の間使用する別の解決策は、配列を形成するときに PHP で日付を取得することです。それでも可能であればMySQL関数を使用したいと思います。問題を解決する現在のコードは次のとおりですが、私が好む方法ではありません。
$data = array(
"first_name"=>"John",
"last_name"=>"Doe",
"entry_date"=>date('Y-m-d H:i:s'),
);
$MyClass->insert("people",$data);