2012-07-15 75 views
2

我目前存儲在MySQL數據庫圖像名稱中,以便於檢索實際圖像。我遇到了我創建的用於存儲名稱的php代碼的問題。未經我的許可,正在將數據庫中的重複項和空白項插入到數據庫中。PHP:插入圖像名稱到數據庫時的重複/空白值

有沒有辦法避免這個頁面刷新時插入重複或空白值的問題?

enter image description here

<? 
$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); 
} 

?> 
+1

SQL ...注入!說:「感謝只有一個空白的列,而不是讓數據庫被利用」。更好地修復你的代碼。還要做一些基本的調試,以便第一時間找到您的錯誤。 – hakre 2012-07-15 19:12:01

回答

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; 
} 
+0

謝謝你,我會解決你和其他評論員所提出的問題。關於函數get_database_connection()的一個問題。我將函數保存在dbConnect.php中,然後從imageupload.php中調用它。我得到這個錯誤:'不能重新聲明之前在dbConnect.php中聲明的get_database_connection() – techAddict82 2012-07-15 20:17:38

+0

在dbConnect.php中執行搜索並確保get_database_connection()沒有聲明兩次= P。 – Anther 2012-07-15 20:36:28

0

嘗試設置會話變量,並告訴它退出或者未設置會話變量重定向。

例如

if (!isset($_SESSION['session_name'])) 
{ 
    exit(); 
} 
0

你或許應該更改以下行:

if(is_array($images)){ 

這樣:

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

爆炸()返回一個空數組,即使沒有「我「參數提供

1

刷新時避免重複的最簡單方法是在POST後重定向頁面,因此只需執行header("Location: {$_SERVER['PATH_INFO']}");即可爲您解決問題。

爲了避免空條目嘗試is_array($images) && count($images)

2

首先,你應該在你的foreach語句檢查名稱爲空白的,因爲這樣的:其次

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

,你應該看看header("Location: ...");來防止用戶刷新這一頁。

第三,您還可以設置會話變量或cookie以防止用戶上傳兩次相同的圖像。

最後,如果圖像名稱是唯一的,您可以在圖像名稱上設置UNIQUE index。然後使用INSERT IGNORE,這將刪除所有重複。