2012-07-15 76 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,这将删除所有重复。