【问题标题】:Inserting data with PDO. I have tried so many ways and failed使用 PDO 插入数据。我尝试了很多方法都失败了
【发布时间】:2015-03-21 09:21:51
【问题描述】:

我刚刚开始学习 PDO。我已连接到我的数据库,并且我的 mySql 数据库正在正常登录。现在我试图从一个表单中获取三段数据,然后将它们插入到表中。我已经为此工作了一周,我想出的每个版本都失败了。当我检查表格时,我没有收到任何错误消息,它仍然是空的。

由于我有其他 PDO 操作正在运行,我确信问题出在以下代码中。涉及的按钮名为“addGig”。这是我第一次使用按钮的名称......我对此没有信心。

我刚刚编辑了这篇文章以包含我修改后的代码。 菜鸟失误太多了!

       $date  = $_POST['date'];
       $venue = $_POST['venue'];
       $time  = $_POST['time'];

   if (!empty($date) && !empty($venue) && !empty($time)){

    try{
        $query = $connect->prepare("INSERT INTO gigs (date, venue, time) VALUES (:date, :venue, :time)");
        $query->bindParam(':date' , $date);
        $query->bindParam(':venue' , $venue);
        $query->bindParam(':time' , $time);
        $query->execute(); 

       }

     catch(PDOException $e)
       {
       handle_sql_errors($query, $e->getMessage());
       }
  }

}

这是我的html表单

  <form>
  <label>date</label><br><input type="text" name="date"><br>
  <label>venue</label><br><input type="text" name="venue"><br>
  <label>time</label><br><input type="text" name="time"><br>
  <br>
  <button type="submit" value="addGig" name="addGig">add gig</button>
  </form>

【问题讨论】:

  • 阅读此dev.mysql.com/doc/refman/5.0/en/identifier-qualifiers.html,您就会知道它失败的原因。另外,检查你没有做的错误。
  • 我不了解错误检查。我的代码是否应该包含显示错误的内容?
  • 见下面马克的回答。
  • 我建议您向我们展示您正在使用的 HTML 表单。另外,您的连接是 PDO,对吗?这将消除一切的猜测;-)
  • 在打开 &lt;?php 标签 error_reporting(E_ALL); ini_set('display_errors', 1); 后立即将错误报告添加到文件顶部,看看它是否产生任何结果。如果您的表单不包含名称属性,您将收到Undefined index xxx 警告。再次向我们展示 HTML 表单。

标签: php mysql forms pdo insert


【解决方案1】:

你有零错误处理,只是假设你的准备永远不会失败。如果你有错误处理,你会被告知你的语法错误:

INSERT INTO gigs ('date', 'venue', 'time') 
                  ^----^--^-----^--^----^----

您使用了错误的引号。 ' 将事物转换为字符串文字。您不能在 MySQL 中使用字符串文字作为标识符。标识符(表/字段名)必须是裸词,或者用反引号引用。由于您的字段名称都不是保留字,因此不需要反引号。但以下任何一种都可以接受

INSERT INTO gigs (`date`, `venue`, `time`) 
INSERT INTO gigs (date, venue, time) 

【讨论】:

  • 当然假设 OP 的表格检查出来了 ;-) ,学习曲线。
  • 谢谢马克。这种错误处理一定很重要。我会调查的。
  • 永远不要假设涉及外部资源的操作会成功。他们只有一种成功的方式(他们“只是做”),而他们失败的方式几乎是无限的。这是基本的防御性编程:始终假设失败,检查失败,并将成功视为惊喜。
  • 哈。感谢 Marc 让我精神振奋。我已将我的代码放入 try/catch 中并使用此 -catch(PDOException $e) { handle_sql_errors($query, $e->getMessage()); }
  • 仅当您在 PDO 中启用异常模式时。默认情况下,它只是在失败时返回一个布尔值 FALSE。
【解决方案2】:

您必须将准备好的语句编辑成正确的格式:

您的数据库中的列不应使用 '.

进行转义
"INSERT INTO gigs (date, venue, time) ...

你可以这样写准备好的语句(为了更好的阅读):

...VALUES (:date, :venue, :time)...

在您的 bindParam 方法中,您可以像这样分配变量:

$query->bindParam(':date' , $date);

或者你在查询中这样做:

...VALUES (?, ?, ?)...

然后:

$query->bindParam(1 , $date);

试试这个:

    $query = $connect->prepare("INSERT INTO gigs (date, venue, time) VALUES (:date, :venue, :time)");
    $query->bindParam(':date' , $date);
    $query->bindParam(':venue' , $venue);
    $query->bindParam(':time' , $time);
    $query->execute();

有关更多信息,请参阅手册: http://php.net/pdo.prepared-statements

【讨论】:

  • 所以,告诉 OP 他们的代码出了什么问题。两种方法都有效。
  • “第二:查询中的参数必须包含':'。” The manual 声明$stmt = $dbh-&gt;prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); $stmt-&gt;bindParam(1, $name); $stmt-&gt;bindParam(2, $value); 同样,两者都是有效的。
  • 好的,我已经格式化了我的代码以匹配 goldlifes 示例。还是行不通。现在我正在检查这种错误处理情况。
  • 哦,是的,你是对的...... :)。我什至总是将我的方法与 :parameter 一起使用,而忘记了 this 与 ? 1 也在工作。我会编辑这个。所以...... OP 查询中的问题是“column_name”......它必须是 INSERT INTO gigs (column_name) 没有 '.
【解决方案3】:

这里有几个问题。 (现在在您发布表单代码后已知)。

其中之一是,您正在使用&lt;form&gt;,当未给出方法时默认为 GET。这与您的 $_POST 变量一起使用。

因此你需要给它一个特定的方法,POST。

<form method="post">

另外,没有动作,默认为self。

如果您将表单与 SQL 分开使用,则需要指定它。

即:

<form method="post" action="handler.php">

另外,您正在/正在为您的列使用引号。删除它们或使用刻度线。

根据您的原始问题,这些不是正确的标识符
https://stackoverflow.com/revisions/28091236/2

('date', 'venue', 'time')

【讨论】:

  • 只是为了仔细检查 -- action="handler.php" 是指我的代码所在的页面?它包含在 GUI 页面中...
  • @user3545757 这是一个例子。如果您的表单名为“form.html”并且您的 SQL 文件名为“database.php”,则将操作命名为该文件。您的表单和 SQL 是否都在一个文件中?
  • 没有。表单在 GUI.php 中,代码在 gigUpdate.php 中,它包含在 GUI.php 中。
  • 然后执行&lt;form action="gigUpdate.php" method="post"&gt;。 @user3545757
  • 我的数据库中是否有可能出现错误?我的登录表工作正常..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
相关资源
最近更新 更多