使用PDO将图片位置上传到数据库并将图片文件上传到目录?

3

请帮我翻译一下这段示例代码,我想将图片添加到文件目录中,并在数据库中存储链接位置,但使用PDO而不是旧方法。

这基于我在网上找到的一个示例,其中包含dbconnect.php、save.php、addstudent.php等文件,对于此查询不需要这些文件。

    <form method="post" name="frmStudent" action="save.php">
    <input type="hidden" name="pid" value="<?php echo $ppid; ?>"/>
        <table>
            <tr><td>First Name</td><td>:</td><td><input type="text" name="fname" required="required" value="<?php echo $pfname; ?>"/></td></tr>
            <tr><td>Last Name</td><td>:</td><td><input type="text" name="lname" required="required" value="<?php echo $plname; ?>"/></td></tr>
            <tr><td>Contact No.</td><td>:</td><td><input type="tel" name="contact" required="required" value="<?php echo $pcontact; ?>"/></td></tr>
            <tr><td>Email</td><td>:</td><td><input type="email" name="email" required="required" value="<?php echo $pemail; ?>"/></td></tr>
             <tr><td>Image</td><td>:</td><td><input type="file" name="email" required="required" value="<?php echo $pimg_url; ?>"/></td></tr>
            <tr><td></td><td></td><td><input type="submit" class="myButton" value="Save"/></td></tr>
        </table>
    </form>

这是保存到数据库的代码。
<?php   
error_reporting(0);
    include ("dbconnection.php");
    $fname=$_POST['fname'];
    $lname=$_POST['lname'];
    $contact=$_POST['contact'];
    $email=$_POST['email'];
    $img_url=$_POST['img_url'];
    $id=$_POST['pid'];
    if($id==null){
            $sql="INSERT INTO student(fname,lname,contact,email,img_url)values(:fname,:lname,:contact,:email,:img_url)";
            $qry=$db->prepare($sql);
            $qry->execute(array(':fname'=>$fname,':lname'=>$lname,':contact'=>$contact,':email'=>$email,':img_url'=>$img_url));
    }else{
            $sql="UPDATE student SET fname=?, lname=?, contact=?, email=?, img_url=? where id=?";
            $qry=$db->prepare($sql);
            $qry->execute(array($fname,$lname,$contact,$email,$img_url,$id));   
    }
    echo "<script language='javascript' type='text/javascript'>alert('Successfully Saved!')</script>";
    echo "<script language='javascript' type='text/javascript'>window.open('index.php','_self')</script>";
?>

任何关于如何做到这一点的见解都将不胜感激,谢谢。

你需要通过基本抽象来清理你的代码。 - Yang
是的,使用那一大堆代码很容易破坏你的系统。 - Yang
你认为信息太多了吗? - kodenavi
不,这并不多,但代码充满了糟糕的实践,包括:1)容易受到SQL注入攻击 2)由于相对路径而存在open_base_dir问题 3)缺少抽象化。 - Yang
事实上,我认为最好简化问题,通过删除不再使用的代码。然后简单地问如何使用PDO将图像添加到文件目录并定位到数据库。 - kodenavi
显示剩余4条评论
2个回答

5
对于无法使Meda的答案起作用的人,只需在<form>元素中添加enctype="multipart/form-data"即可。

2

首先,开始修复图像的HTML输入。

<tr>
    <td>Image</td><td>:</td>
    <td><input type="file" name="image" required="required" value=""/></td>
</tr>

然后扩展您的PHP代码:

<?php   
error_reporting(0);
include ("dbconnection.php");

if(is_uploaded_file($_FILES['image']['tmp_name'])){ 
    $folder = "upload/"; 
    $file = basename( $_FILES['image']['name']); 
    $full_path = $folder.$file; 
    if(move_uploaded_file($_FILES['image']['tmp_name'], $full_path)) { 
        echo "succesful upload, we have an image!";
        $fname=$_POST['fname'];
        $lname=$_POST['lname'];
        $contact=$_POST['contact'];
        $email=$_POST['email'];
        $img_url= $full_path;
        $id=$_POST['pid'];
        if($id==null){
            $sql="INSERT INTO student(fname,lname,contact,email,img_url)values(:fname,:lname,:contact,:email,:img_url)";
            $qry=$db->prepare($sql);
            $success = $qry->execute(array(':fname'=>$fname,':lname'=>$lname,':contact'=>$contact,':email'=>$email,':img_url'=>$full_path));
        }else{
            $sql="UPDATE student SET fname=?, lname=?, contact=?, email=?, img_url=? where id=?";
            $qry=$db->prepare($sql);
            $success = $qry->execute(array($fname,$lname,$contact,$email,$full_path,$id));   
        }

        if($success){
            echo "<script language='javascript' type='text/javascript'>alert('Successfully Saved!')</script>";
            echo "<script language='javascript' type='text/javascript'>window.open('index.php','_self')</script>";
        }else{
            echo 'db transaction failed';
        }
    } else { 
       echo "upload received! but process failed";
    } 
}else{ 
    echo "upload failure ! Nothing was uploaded";
} 
?>

@kodenavi 你是什么意思? - meda
1
哎?好的,让我更简单地解释一下问题。
  • 文件上传功能正常,可以将图像文件放置在目录中。
  • 在提交表单时,我会收到“上传成功,我们有一张图片!”和“数据库事务失败”的提示。
  • 这是不正确的,因为它确实完成了DB事务。
  • 然而,我使用相同的表单来基于ID更新表单案例,如果我想要更新同一记录,但是它不是更新,而是创建新记录。
- kodenavi
谢谢你的回复,虽然没有帮到我,但是我已经将“:pimg_url”从“$pimg_url”更改为“$full_path”,这似乎解决了新记录和更新记录的问题。 - kodenavi
1
嗨,经过几次抓狂之后,我似乎遇到了更多问题。这段代码非常依赖于文件上传,如果我不上传文件,就无法添加或更新记录。我该如何使上传变为可选项? - kodenavi
@kodenavi,请发布包含完整可运行代码的新答案,这将对其他人非常有帮助。 - fresher
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接