2

現在、実際の画像を簡単に取得できるように、MySQL データベースの画像名に保存しています。名前を格納するために作成した php コードに問題があります。私の許可なく DB に重複した空白の挿入が行われています。

ページが更新されたときに重複または空白の値が挿入されるというこの問題を回避する方法はありますか?

ここに画像の説明を入力

<?
$images = explode(',', $_GET['i']);

$path = Configuration::getUploadUrlPath('medium', 'target');


if (is_array($images)) {
    try {
        $objDb = new PDO("mysql:host=" . $host . ";dbname=" . $db, $user, $pass);
        $objDb->exec('SET CHARACTER SET utf8');
    } catch (PDOException $e) {
        echo 'There was a problem';
    }

    $sql = "INSERT INTO `urlImage` (`image_name`) VALUES ";

    foreach ($images as $image) {
        $value[] = "('" . $image . "')"; // collect imagenames
    }

    $sql .= implode(',', $value) . ";"; //build query
    $objDb->query($sql);
}

?>
4

5 に答える 5

3

少し読みやすく、コード内で何が起こっているのかをより簡単に分離できるように、物事を再フォーマットしました。また、クエリを更新して、入力を適切に「サニタイズ」する方法を示しました。

データをサーバーに送信しようとしているプロセスはまだ間違っていると思いますが、このコードが少し役立つことを願っています. 私もこれをよりオブジェクト指向で行います..しかし、それはあなたの質問の範囲を少しだけ残していると感じています= P. 他のみんなが言っているように、あなたのコードのロジックはほんの少しだけずれていました.

重複については、データベースに追加する前に、ファイルが既に存在するかどうかを確認してください。

<?php
$_GET['i'] = 'file1.png, file2.png, file3.png'; // This is just for testing ;].

$images = retrieve_images();
insert_images_into_database($images);

function retrieve_images()
{
    //As someone else pointed out, you do not want to use GET for this and instead want to use POST. But my goal here is to clean up your code
    //and make it work :].

    $images = explode(',', $_GET['i']);
    return $images;
}

function insert_images_into_database($images)
{
    if(!$images)//There were no images to return
        return false;

    $pdo = get_database_connection();

    foreach($images as $image)
    {
        $sql = "INSERT INTO `urlImage` (`image_name`) VALUES ( ? )";
        $prepared = $pdo->prepare($sql);
        $prepared->execute(array($image));
    }
}

function get_database_connection()
{
    $host = 'localhost';
    $db = 'test';
    $user = 'root';
    $pass = '';
    try {
        $pdo = new PDO("mysql:host=" . $host . ";dbname=" . $db, $user, $pass);
        $pdo->exec('SET CHARACTER SET utf8');

        } catch(PDOException $e) {
            die('There was a problem');
        }

    return $pdo;
}
于 2012-07-15T19:27:50.450 に答える
2

foreachまず、次のように、ステートメント内の空白の名前を確認する必要があります。

foreach ($images as $image) {
    if($image!='') {
        $value[] = "('".$image."')"; // collect imagenames
    }
}

次に、header("Location: ...");ユーザーがページを更新できないようにする方法を検討する必要があります。

第 3 に、セッション変数または Cookie を設定して、ユーザーが同じ画像を 2 回アップロードするのを防ぐこともできます。

最後に、イメージ名が一意である場合は、イメージ名にUNIQUE インデックスを設定できます。次にINSERT IGNOREand を使用すると、すべての重複が削除されます。

于 2012-07-15T19:13:54.867 に答える
1

更新時に重複を回避する最も簡単な方法は、POST 後にページをリダイレクトheader("Location: {$_SERVER['PATH_INFO']}");することです。

空のエントリを回避するには、試してくださいis_array($images) && count($images)

于 2012-07-15T19:12:41.057 に答える
0

セッション変数を設定してみて、セッション変数が設定されていないときに終了またはリダイレクトするように指示してください。

例えば

if (!isset($_SESSION['session_name']))
{
   exit();
}
于 2012-07-15T19:09:27.783 に答える
0

おそらく次の行を変更する必要があります。

if(is_array($images)){

これに:

if(!empty($images) && is_array($images)){

「i」パラメーターが指定されていない場合でも、explode() は空の配列を返します。

于 2012-07-15T19:09:37.510 に答える