2

我目前将图像名称存储在 MySQL 数据库中,以便更轻松地检索实际图像。我创建的存储名称的 php 代码有问题。未经我的许可,正在向数据库中插入重复和空白的内容。

有没有办法避免在页面刷新时插入重复或空白值的问题?

在此处输入图像描述

<?
$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: ...");防止用户刷新页面。

第三,您还可以设置会话变量或 cookie 以防止用户两次上传相同的图像。

最后,如果图像名称是唯一的,您可以在图像名称上设置一个UNIQUE 索引。然后使用INSERT IGNORE,这将删除所有重复项。

于 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 回答