【问题标题】:PHP Multiple file upload with multiple inputsPHP多文件上传与多个输入
【发布时间】:2015-06-27 08:54:58
【问题描述】:

我是 PHP 新手。现在我的文件上传有问题。 所有文件都被移动,但它没有将文件名存储到数据库中。 它没有显示错误。我不知道要解决这个问题。请帮帮我。

<form method="post" action="index.php?insert_ads" enctype="multipart/form-data">
    <input type="file" name="b1" id="b1"/>

    <b>Link</b></br>
    <input type="text" id="b1l" name="b1l" class="form-control"/></br>

    <b>Home Small</b> <b style="color: blue;">100 x 100 px</b></br>
    <input type="userfile" name="b2" id="b2"/><br>

    <b>Link</b></br>
    <input type="text" id="b2l" name="b2l" class="form-control"/></br>

    <input type="submit" name="submit" value="Publish"/>

</form></br>

<?php 

if(isset($_POST['submit'])){

    $b1 = $_FILES['b1']['name'];
    $tmp1 = $_FILES['b1']['tmp_name']; 
    $b1l = $_POST['b1l'];
    $b2 = $_FILES['b2']['name'];
    $tmp2 = $_FILES['b2']['tmp_name'];
    $b2l = $_POST['b2l'];

    move_uploaded_file($tmp1,"ads/$b1");
    move_uploaded_file($tmp2,"ads/$b2");

    $insert_posts = "insert into ads (b1,b2) value ('$b1','$b2')";
    $run_posts = mysql_query($insert_posts);
}
?>

【问题讨论】:

  • 您很容易受到sql injection attacks 的攻击,您的数据库调用绝对有NO 错误处理。您对上传的内容绝对没有错误检查。在这两种情况下,您都只是假设不会出错,这是非常非常非常糟糕的编码实践。永远不要假设成功。假设失败,检查失败,并将成功视为惊喜。
  • 警告:如果您只是学习 PHP,请不要学习过时的 mysql_query 接口。这很糟糕,并且在 PHP 的未来版本中被删除。像PDO is not hard to learn 这样的现代替代品。像PHP The Right Way 这样的指南可以帮助解释最佳实践。始终绝对确定您的用户参数是properly escaped,否则您将遇到严重的SQL injection bugs
  • 你有连接数据库的代码吗?也可以放在这里吗?您的桌面广告在 DB 中的外观如何?
  • 你有一个错字。在查询中使用 valueS$insert_posts = "INSERT INTO ads (b1,b2) VALUES ('$b1','$b2')";
  • 感谢您提供的所有信息:D 现在可以使用了

标签: php mysql forms file-upload input


【解决方案1】:

尽管在使用 mysql_query 或注入攻击方面存在任何问题,但这里仍有许多可能出错的地方。

一种选择是查询正在执行,但您没有正确分配$b1$b2 变量。如果将行添加到数据库中,但行是空的(例如,SELECT b1, b2 FROM db.ads" 返回 '','' 的行),就会出现这种情况;在这种情况下,您可能只是没有提取 name 属性正确地从 $_FILES 变量中获取。您可以运行var_dump($_FILES); 以查看有关它的更多信息并找出您需要获取的内容。

另一种可能是查询没有执行。同样,这可能有几个原因——也许(不知何故)它没有达到代码中的那个点。你可以这样测试:

$insert_posts = "insert into ads (b1,b2) value ('$b1','$b2')";
echo $insert_posts; // if this shows up, you're running the next line also
$run_posts = mysql_query($insert_posts);

另一个选项是您的error reporting 级别未捕获错误。一个可能的原因是您没有连接到数据库——根据mysql_query 文档...

如果未找到或建立连接,则会生成 E_WARNING 级别的错误。

除非您已将程序配置为不同的行为,否则 E_WARNING 级别的错误将允许程序继续执行。

最后,您可能遇到了语法错误(实际上您似乎有——VALUES,而不是VALUE);根据文档,mysql_query 在错误时返回 false - 它不会引发错误。

您可以通过测试是否为 false 并使用 mysql_error 函数来获取错误来实现它:

$run_posts = mysql_query($insert_posts);
if ($run_posts === false) { 
  trigger_error("Error in SQL!\n" + mysql_error(), E_USER_ERROR); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多