2012-03-19 106 views
3

好吧,这一个是让我疯了。我有一个后端文件上传器,可以将.jpg文件上传到服务器。然后我想将.jpgs的文件名上传到我的数据库。所以当页面加载时,我可以从数据库中添加文件名,图片将显示在页面上。这工作正常,但我也需要能够更新数据库中的文件和文件名。如果用户更改所有文件和文件名称,则一切正常。但是,如果用户只想更改一个或两个文件和文件名,则MySql更新语句最终会使一些变量为空,从而有效地删除记录中的现有文件名,而不是将它们留在单独的文件中。像往常一样,我已经搜索stackoverflow和谷歌之前寻求帮助,我还没有发现任何真正中肯的。这是适用的代码。MySQL更新一些数据库字段而不覆盖字段没有改变

<?php 
session_start(); 
$id = $_SESSION['id']; 

//This is the directory where images will be saved 
$target = "imgs/"; 
// "http://www.surfcup.com/travel_site/images/ "; 

$targetlogo = $target . basename($_FILES['imageLogo']['name']); 
$targetpic1 = $target . basename($_FILES['image1']['name']); 
$targetpic2 = $target . basename($_FILES['image2']['name']); 
$targetpic3 = $target . basename($_FILES['image3']['name']); 
$targetpic4 = $target . basename($_FILES['image4']['name']); 
$targetpic5 = $target . basename($_FILES['image5']['name']); 

//This gets all the other information from the form 

$logo=($_FILES['imageLogo']['name']); 
$pic1=($_FILES['image1']['name']); 
$pic2=($_FILES['image2']['name']); 
$pic3=($_FILES['image3']['name']); 
$pic4=($_FILES['image4']['name']); 
$pic5=($_FILES['image5']['name']); 


// Connects to Database 
mysql_connect("localhost", "surfcup_HotAdmin","password") or die ('I cannot connect to  the database because: ' .mysql_error()); 
mysql_select_db("surfcup_hotels") or die('I cannot connect to the database because: .mysql_error()); 

$query="UPDATE Hotels 
SET 
hotel.imageLogo = '".$logo."', 
hotel.image1 = '".$pic1."', 
hotel.image2 = '".$pic1."', 
hotel.image3 ='".$pic1."', 
hotel.image4 = '".$pic1."', 
hotel.image5 = '".$pic1."' 
WHERE Hotels.id='".$id."'"; 


mysql_query($query) or die ('Error Updating Hotel '.mysql_error()); 

//stuff to upload the files below 



?> 

我想我要么需要检查,如果变量是空,有点不达加载它们或接受空条目停止数据库。然而,后者虽然会让用户在创建记录时添加6个文件。如果他们只有5或3呢?我似乎无法理解我将如何检查变量是否为空,并仅在UPLOAD语句中上载带有文件名的变量。再次感谢您的帮助。 戴夫

+0

感谢您的回复。我似乎无法弄清楚如何做到这一点 – user316717 2012-03-19 04:20:27

+0

在让人们编辑文件的形式中,是否有6个上传文件,如果他们选择只上传三个文件,其他文件就会变成空的。 – 2012-03-19 04:36:01

+0

我支持cilliosis的答案,这基本上是你的想法的实现 - 你正在检查,看看哪些字段不需要更新,只是留下你的更新查询。我还想指出,在你的示例代码中,你将所有5个图像设置为'$ pic1',这可能会造成它自己的问题。 – octern 2012-03-19 05:13:52

回答

0

你可以试试这个。基本上它会检查值是否为空。如果不是,则它将该值添加到数组中。最后,我们将数组内插入一个字符串中,我们将添加到您的查询中。在这个例子中,我只做了一些图像,但你应该明白。它应该能够限制我的代码中的语法错误。

虽然我会说这不是最好的办法。您绝对可以改善这一点,并使其更安全,更高效。

$uploaded_images = array(); 

if(!empty($logo)){ 
    $uploaded_images[] = "hotel.imageLogo = '".$logo."'"; 
} 

if(!empty($pic1)){ 
    $uploaded_images[] = "hotel.image1 = '".$pic1."'"; 
} 

if(!empty($pic2)){ 
    $uploaded_images[] = "hotel.image2 = '".$pic2."'"; 
} 

$values_to_set = implode(', ', $uploaded_images); 
$query= "UPDATE Hotels SET " . $values_to_set . " WHERE Hotels.id='" . $id . "'"; 
+0

谢谢大家,这正是我正在分组的解决方案。特别是数组内爆功能,精彩!再次感谢。 – user316717 2012-03-19 17:36:19

2

我认为这样做的更好方法是动态构建您的查询。例如:

$images = array(); 
$images[] = ($_FILES['imageLogo']['name']); 
$images[] = ($_FILES['image1']['name']); 
$images[] = ($_FILES['image2']['name']); 
$images[] = ($_FILES['image3']['name']); 
$images[] = ($_FILES['image4']['name']); 
$images[] = ($_FILES['image5']['name']); 

// Looping index to determine which hotel image it is 
$index = 0; 

// Start building query 
$query = "UPDATE Hotels SET hotel.imageLogo = '".$images[0]."'"; 

// Loop through images and check if empty string 
foreach($images as $image) 
{ 
    if(!empty($image) && $index != 0) 
    { 
    // Image name found, add to query 
    $query .= " hotel.image".$index." = '".$image."',"; 
    } 
    // First hotel image iteration needs to be 1 
    $index++; 
} 

// Finish query 
$query .= " WHERE Hotels.id='".$id."'"; 
+0

你还没有在更新声明中捕获imageLogo – 2012-03-19 04:42:55

+0

是的,我发现后,我注意到了。刚做了编辑。 – 2012-03-19 04:44:13

+0

我认为你需要在每一列更新后添加逗号。 – Gohn67 2012-03-19 04:53:22