将文件上传到服务器,但文件名不保存到数据库

问题描述:

这是问题:文件名未被保存到数据库中。文件正在上传到服务器上,但文件名不会保存。一旦文件上传成功,我可以回显文件名,但是无论出于何种原因,它都希望将文件名保存到数据库中。我确信这是一个简单的解决方案,我只是缺少一些东西(我希望)。将文件上传到服务器,但文件名不保存到数据库

在此先感谢。

(PS是的,我知道我应该使用的mysqli)

HTML:

<form action="" name="loa" method="post" enctype="multipart/form-data"> 
    <input type="hidden" name="size" value="350000"> 
    <input type="file" name="loa"> 
    <input type="submit" name="loasub" value="Upload Letter of  Authorization"> 
</form> 

PHP:

<?php 
    if (!empty($_POST['loasub'])) { 
     $target = "loa/"; 
     $target = $target . basename($_FILES['loa']['name']); 
     $theloa = ($_FILES['loa']['name']); 
     mysql_connect("localhost", "user", "pass") or die(mysql_error()) ; 
     mysql_select_db("mydb") or die(mysql_error()) ; 

     //Writes the information to the database 
     mysql_query("UPDATE customers SET loa='$theloa' WHERE id='30'") ; 
     if(move_uploaded_file($_FILES['loa']['tmp_name'], $target)) 
     { 
      echo "The file ". basename($_FILES['uploadedfile']['name']). " has been uploaded"; 
      echo $theloa; 
     } 
     else { 
      echo "Sorry, there was a problem uploading your file."; 
     } 
    } 
?> 
+2

** WARNING **你的代码中包含[SQL注入漏洞(http://en.wikipedia.org/wiki/SQL_injection) - !你逝去的原始的,未经过滤,未经验证的用户直接输入到一个以字符串形式存在的SQL字符串......是的,文件名,*是*它很重要。请[切换到PDO](http://php.net/book.pdo)或[mysqli](http://php.net/book.mysqli),以便您可以使用[带有参数化查询的预准备语句](http: //en.wikipedia.org/wiki/Prepared_statement)。 – Charles

一对夫妇的事情要考虑:

  1. mysql_*功能已被弃用。改为使用mysqliPDO
  2. 如果变量$theloa中包含单引号,则可以中断查询。使用预准备语句来防止此类错误,并防止(警笛声和红灯闪烁)SQL注入。

考虑做一个var_dump($_FILES['loa']['name'])并粘贴它与您的问题,以更清晰。

尝试使用以下修改后的mysqli版本的文件(您需要在PHP安装中启用mysqli扩展)。它应该(理想情况下)工作。

<?php 
    if (!empty($_POST['loasub'])) { 

     $theloa = ($_FILES['loa']['name']); 
     $target = "loa/"; 
     $target = $target . basename($theloa); 

     $mysqli = new mysqli("localhost", "user", "password", "mydb"); 
     if (mysqli_connect_errno()) { 
      die(mysqli_connect_error()); 
     } 


     //Writes the information to the database 
     if ($preparedStatement = $mysqli->prepare("UPDATE customers SET loa=? WHERE id=30")) { 
      $preparedStatement->bind_param("s", $theloa); 
      $executionResult = $preparedStatement->execute(); 
      if (!$executionResult) { 
       die("Query execution failed!"); 
      } 
      //$preparedStatement->bind_result($sqlOutput); // bind mysql output to an output variable 
      //$preparedStatement->fetch(); // fetch mysql output 
      //var_dump($sqlOutput); // dump the sql output 

      $preparedStatement->close(); 
     } 
     $mysqli->close(); 

     if(move_uploaded_file($_FILES['loa']['tmp_name'], $target)) 
     { 
      echo "The file ". basename($_FILES['uploadedfile']['name']). " has been uploaded"; 
      echo $theloa; 
     } 
     else { 
      echo "Sorry, there was a problem uploading your file."; 
     } 
    } 
?> 

尝试像这个 - 运行qurety(删除单引号ID = '30')

mysql_query("UPDATE customers SET loa='$theloa' WHERE id=30") ; 
+0

试过了,但是没有运气:( – Alex

+0

Alex:你的表单名称(attr)和文件名(属性)是一样的,试着去改变它,它会起作用 –

PHP的值不能成quotes-(删除从$ LOA单引号)

尝试这种情况:

mysql_query("UPDATE customers SET loa=$theloa WHERE id='30'") ; 

调试

 
$conn = mysql_connect($dbhost, $dbuser, $dbpass); 

$sql = mysql_query("UPDATE customers SET loa=$theloa WHERE id='30'") ; 

mysql_select_db('customers '); 
$retval = mysql_query($sql, $conn); 
if(! $retval) 
{ 
    die('Could not update data: ' . mysql_error()); 
} 
echo "Updated data successfully\n"; 
mysql_close($conn); 
?> 
+0

看起来还是不行,奇数 – Alex

mysql_query("UPDATE customers SET loa='$theloa' WHERE id='30'") ; 

运行或死亡(mysql_error());

mysql_query("UPDATE customers SET loa='$theloa' WHERE id='30'") or die(mysql_error()) ; 

也许有在查询时出现错误,即使没有语法错误,它可能是错的字段名。除此之外,只要变量$ theloa被填充,似乎就没有问题。 mysql_error会告诉如果查询甚至被执行?

+0

明白了!文件名有一个特殊的字符,只需要使用mysql_real_escape_string。谢谢! – Alex

+0

hehe那么其他答案如何被接受,因为即使它是一个完美的答案,它不会回答你所需要的设计: ) –