2

チェックボックスからSQLデータベースにデータを挿入するこの機能があり、検索するだけで機能しますが、これにはかなり慣れていないので、(SQLインジェクションから)より良い/安全な方法があるかどうか知りたいです。準備済みステートメントで PDO を使用する必要があることはわかっていますが、これについては後で取り組みます。

以下は、html チェックボックスを生成するフォームです。

<form action="" method="post">
<?php
    if(empty($clients) === true){   
    echo '<p>You do not have any clients yet.</p>';
    }
    else
    {
    foreach($clients as $client){
    echo'
        <input type="checkbox"  name="client_data[]" value="'.$_SESSION['user_id'].'|'.$class_id.'|'.$client['first_name'].'|'.$client['nickname'].'|'.$client['last_name'].'">
        '.$client['first_name'].' ('.$client['nickname'].') '.$client['last_name'].'
         <br />';


   } // foreach($client

} // if empty 

?>

関数を呼び出すphpは次のとおりです。

if (isset($_POST['exist_to_class'])){
if (empty($_POST['client_data']) === true){
    $errors [] = 'You much select a client to be added to the class.';
} else {
    if (isset($_POST['client_data']) && !empty($_POST['client_data']));
    foreach ($_POST['client_data'] as $cd){
     exist_client_to_class($cd);
     header('Location: view_class.php?class_id='.$class_id.' ');

} // foreach $cd

} // else

} //isset

そして、データをデータベースに挿入する関数は次のとおりです。

// add existing client to class  ----------------------------------------------------
function exist_client_to_class($cd){

list($user_id, $class_id, $first_name, $last_name, $nickname) = explode('|', $cd);
mysql_query("INSERT INTO `clients` (user_id, class_id, first_name, last_name, nickname, date) 
            VALUES('$user_id', '$class_id', '$first_name', '$last_name', '$nickname', CURDATE())");

}

最初に PDO の準備済みステートメントを突き刺します: UPDATE

function exist_client_to_class($cd){

try{

$stmt = $conn->prepare('INSERT INTO clients 
(user_id, class_id, first_name, last_name, nickname, date)
VALUES (:user_id, :class_id, :first_name, :last_name, :nickname, CURDATE())
');

list($user_id, $class_id, $first_name, $last_name, $nickname) = explode('|', $cd);

$stmt->execute(array(
        ':user_id' => $user_id, 
        ':class_id' => $class_id, 
        ':first_name' => $first_name,
        ':last_name' => $last_name,
        ':nickname' => $nickname
        )
        );
}

catch(PDOException $e) {
    echo 'Error: ' . $e->getMessage();
}

}

db 接続ファイルは次のとおりです。

//PDO database connect
try {
$conn = new PDO('mysql:host=localhost;dbname=customn7_cm', '**********', '**********');
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->exec("SET CHARACTER SET utf8");
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
4

2 に答える 2

2

簡単に言えば、はい。

とにかく、ユーザーデータをサニタイズしたりエスケープしたりすることはありません。古いmysql_*コミュニティで廃止された関数を使用しています。あなたが最善の策は、PDOまたはを使い始めることですMysqli

この記事を読んでください:PHPデータベースアクセス:あなたはそれを正しくやっていますか?

于 2012-11-13T15:34:00.657 に答える
1

これは、ほとんどの sql インジェクションで機能します: ( php.netから)
decleration:
string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier = NULL ] )

       // 接続
       $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password') または die(mysql_error());
        // クエリ
        $query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
        mysql_real_escape_string($user),
        mysql_real_escape_string($password));

于 2012-11-13T15:53:47.613 に答える