【问题标题】:How to upload and save a file in db using PHP, MySQL and mysqli_query?如何使用 PHP、MySQL 和 mysqli_query 在 db 中上传和保存文件?
【发布时间】:2019-06-21 00:01:52
【问题描述】:

我正在尝试使用 PHP 加载文件并将其保存在表中,但它返回失败。图片确实上传了,但是我的mysqli_query 有问题。

HTML

<form action="server.php" enctype="multipart/form-data" method="post"
id="myForm">
          <select name="type">
            <option value="">Välj typ här</option>
            <option value="photo">Photo</option>
            <option value="video">Video</option>
            <option value="audio">Audio</option>
          </select>
          <input type="text" name="title" placeholder="Titel" class="title">
          <input type="file" name="media" class="btn">
          <input type="submit" value="Spara media" class="btn">
        </form>

Javascript:

$("#myForm").submit(function(e) {
    // Förhindrar att vi skickas iväg till en ny sida (standardhändelsen)
    e.preventDefault();
    // Hämtar formulärsdata (värde från drop-down menyn, samt filen)
    var formData = new FormData(this);

    // Gör ett ajax-anrop
    $.ajax({
        url: $(this).attr("action"), // Till adressen "server.php"
        type: $(this).attr("method"), // Med metoden "post"
        data: formData, // Vår data vi skickar med
        dataType: "JSON", // Hur vi ska tolka den data vi får tillbaka (som JSON)
        cache: false, // Vi tillåter inte att webbläsaren att cacha några resultat
        contentType: false, // Vi vill inte att jQuery ska bestämma hur vårt
        innehåll ska tolkas
        processData: false // Vi tillåter inte att jQuery att processa vår data (som strängar)
    }).done(function (data) {
        // Om vi får ett lyckat svar
        console.log(data);
    }).fail(function(data){
        // Om vi får ett misslyckat svar
        console.log(data);
    });
});

PHP:

$servername = "*hidden*";
$username = "*hidden*";
$password = "*hidden*";
$db = new mysqli($servername, $username, $password);

if (!$db) {
 echo "Error: Unable to connect to MySQL." . PHP_EOL;
 echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
 echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
 exit;
}

$return = new ArrayObject();

if(isset($_FILES['media']['tmp_name'])){
$path = $_POST['type']."/";
$fileName = $path.rand().$_FILES['media']['name'];

if(move_uploaded_file($_FILES['media']['tmp_name'], $fileName)){
 $title = "";
 if(isset($_POST['title'])){
  $title = $_POST['title'];
 }
 if(mysqli_query($db, "INSERT INTO media (title, type, path) VALUES 
 ('".$title."', '".$_POST['type']."', '".$fileName."')")){
  $return['success'] = true;
  $return['path'] = $fileName;
  $return['title'] = $title;
  $return['message'] = "File uploaded and saved in db";
  echo json_encode($return);
 }else{
  $return['success'] = false;
  $return['path'] = $fileName;
  $return['title'] = $title;
  $return['message'] = "File uploaded but not saved in db";
  echo json_encode($return);
 }

 }else{
  $return['success'] = false;
  $return['message'] = "Kunde inte ladda upp filen";
  echo json_encode($return);
 }
  }

if(isset($_GET['action']) and $_GET['action'] == "getMedia"){
if(isset($_GET['type'])){
$res = mysqli_query($db, "SELECT * FROM media WHERE type = 
'".$_GET['type']."' ORDER BY id DESC");
}else{
$res = mysqli_query($db, "SELECT * FROM media ORDER BY id DESC");
}
$media = new ArrayObject();
while($row = mysqli_fetch_assoc($res)){
$m = new ArrayObject();
$m['path'] = $row['path'];
$m['type'] = $row['type'];
$m['title'] = $row['title'];
$m['timestamp'] = $row['timestamp'];
//$m['id'] = $row['id'];
$media['files'][] = $m;
}
echo json_encode($media);
}


?>

Here is the console message received:

编辑:这是错误消息传递到控制台的位置,在 php 文件中找到

}else{
  $return['success'] = false;
  $return['path'] = $fileName;
  $return['title'] = $title;
  $return['message'] = "File uploaded but not saved in db";
  echo json_encode($return);
 }

第二次编辑。
我将此行添加到我的 else:
echo("错误描述:" .mysqli_error($db));
这产生了以下消息:
"错误描述:未选择数据库{"success":false,"path":"photo/2969cloak.JPG","title":"Hej","message":"文件已上传但未保存在 db"}"

【问题讨论】:

  • 警告:当使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到您的查询中。 不要使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug切勿$_POST$_GET任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。
  • 注意:mysqli 的面向对象接口明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql_query 接口混淆。在您对程序风格投入过多之前,值得转换一下。示例:$db = new mysqli(…)$db-&gt;prepare("…") 过程接口是 PHP 4 时代的产物,当时引入了 mysqli API,理想情况下不应在新代码中使用。
  • 注意:enabling exceptions in mysqli可以检测和解决很多问题,所以任何错误都不容易被忽略。很多返回值是不能忽略的,必须注意每一个。异常不需要单独检查,它们可以在代码的更高级别被捕获。
  • MySQL 是否返回任何错误?
  • @Marika 在else 块中使用$errors = $mysqli-&gt;error_list 来获取由insert 语句引起的错误。使用file_put_contentsprint_r 记录$error 的值以查看导致问题的原因;

标签: php mysql database


【解决方案1】:

我看不到您选择数据库的位置。 你可以使用mysqli_select_db ($db, "Database_Name")

我通常将查询生成与查询执行分开,以帮助调试 SQL 中的错误。您还可以返回原始查询并尝试直接在 MySQL 中运行它,例如:

$query="INSERT INTO media (title, type, path) VALUES ('".$title."', '".$_POST['type']."', '".$fileName."')";

$return['query'] =  $query;  

此外,您还可以捕获错误消息:

if(mysqli_query($db, $query)){
     //success
     $return['error'] = "success";
     ...

} else {
    $return['error'] = "Error: ". $query ."<br /> \n". mysqli_error($db) ."<br /> \n";
    ...

}

【讨论】:

  • 其实就是这么简单。我没有选择数据库,只选择了主机。这样做的原因是,在我的情况下,用户名和数据库是相同的,因为它是学校服务器。谢谢
【解决方案2】:

其实就是这么简单。我没有选择数据库,只选择了主机。这样做的原因是,在我的情况下,用户名和数据库是相同的,因为它是学校服务器。谢谢大家!

【讨论】:

    猜你喜欢
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    相关资源
    最近更新 更多