【问题标题】:Can not insert data into a database using php's PDO无法使用 php 的 PDO 将数据插入数据库
【发布时间】:2024-01-23 00:15:01
【问题描述】:

我制作了一个表单,一旦提交就应该将数据插入数据库。如果我在查询字符串中使用变量名称,例如 INSERT INTO 表(名称,注释)VALUES($name,$comment),它可以工作,但如果我使用 pdo 准备好的语句,它就不起作用,这是我目前拥有的代码:

move_uploaded_file($_FILES["file"]["tmp_name"], "../img/" . $_FILES["file"]["name"]);
$stmt = $conn->prepare('INSERT INTO instructors (name, bio, picture) VALUES (:name, :bio, :picture)');
$stmt->bindParam(':name', $_POST['name']);
$stmt->bindParam(':bio', $_POST['bio']);
$stmt->bindParam(':picture', $_POST['file']['name']);
$stmt->execute();

文件上传并移动到我说的目录,但没有数据插入数据库。任何想法为什么?

【问题讨论】:

  • 可能是 SQL 错误。看看$stmt->errorInfo
  • 看起来你的意思是使用 $_FILES['file']['name'] 而不是 $_POST['file']['name'] 但这不会导致插入失败,只是一个空白值,除非 picture 列是 NOT NULL
  • @MichaelBerkowski 当然,根据列,有一个空白值会影响INSERT
  • 除非图片不能为空。那么查询就会失败。也许 Ben 可以发布表模式?
  • 请注意:使用用户提供的名称将文件保存在服务器上并不是一个好主意。而是为其生成一个随机名称。

标签: php mysql insert pdo


【解决方案1】:

试试

move_uploaded_file($_FILES["file"]["tmp_name"], "../img/" . $_FILES["file"]["name"]);
$stmt = $conn->prepare('INSERT INTO instructors (name, bio, picture) VALUES (:name, :bio, :picture)');
$stmt->bindParam(':name', $_POST['name']);
$stmt->bindParam(':bio', $_POST['bio']);
$stmt->bindParam(':picture', $_POST['filename']);// Only 1 set of []s in $_POST[]
$stmt->execute();

【讨论】:

    【解决方案2】:

    我相信你应该这样做:

    move_uploaded_file($_FILES["file"]["tmp_name"], "../img/" . $_FILES["file"]["name"]);
    $stmt = $conn->prepare('INSERT INTO instructors (name, bio, picture) VALUES (:name, :bio, :picture)');
    
    $stmt->execute(array(
        ':name'=> $_POST['name'],
        ':bio'=> $_POST['bio'],
        ':picture'=> $_POST['file']['name']
    ));
    

    【讨论】:

    • 为什么是负面的?这来自 php 手册,他说“如果我在查询字符串中使用变量名,如 INSERT INTO table (name, comment) VALUES ($name, $comment) 就可以了”,所以问题不在于名称列或空值作为 sugested ...
    • 我没有投反对票,但样板示例是多余的,应该删除。
    • 好的,谢谢你的建议,只留下了作者代码的建议