【问题标题】:Problem with INSERTing to MySQL table, by PHP PDOPHP PDO 插入 MySQL 表的问题
【发布时间】:2011-09-15 09:39:51
【问题描述】:


我创建简单的应用程序,第一次使用 PDO,并坚持 问题...
我在网上搜索了类似的东西,但没有找到。
我无法将数据插入表中。自动增量值正在变化,所以 一些数据被发送到表中。
如果我使用变量中的值回显查询,请将其复制并粘贴到 phpmyadmin,行已正确插入。
日志包含相同的查询,MySQL 和 PHP 不返回任何错误...

现在我有什么:

课堂文章:

class article{
    private function findMaxSortId($pdo_object){
        $query_sort="
                    SELECT MAX(sort_id) as max_id
                    FROM articles";
        try{
            $pdo_object->prepare($query_sort);
            $max_row=$pdo_object->query($query_sort)->fetch(PDO::FETCH_ASSOC);
        }
        catch(PDOException $eSortId){
            $return['error_code_sort']=$eSortId->errorCode();
            $return['error_info_sort']=$eSortId->errorInfo();
        }
        $return['max_id']=$max_row['max_id'];
        return $return;
    }    
    public function createArticle($pdo_object, $title, $body, $visible, $incerase_sort_id=2){
        $return=$this->findMaxSortId($pdo_object);
        $sort_id=$return['max_id']+$incerase_sort_id;

        $pdo_object->exec("
            INSERT INTO `articles` (sort_id, visible, title, body)
            VALUES ('".$sort_id."', '".$visible."', '".$title."', '".$body."')
        ");
        $return['id']=$pdo_object->lastInsertId();
        return $return;
    }
}


index.php:

if(isset($_POST['save'])&&$_POST['save']=='add'){
    if (isset($_POST['visible'])) {
        $visible=1;
    }
    else{
        $visible=0;
    }
    require_once 'class/class.article.php';
    $art = new article();
    $art->createArticle($pdo, $_POST['title'], $_POST['body'], $visible);
    unset($art);
}


数据库中的文章表:

CREATE TABLE `articles` (
    `article_id` int(11) NOT NULL AUTO_INCREMENT,
    `sort_id` int(11) DEFAULT NULL,
    `lastmod` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `visible` tinyint(1) DEFAULT NULL,
    `title` varchar(200) COLLATE utf8_unicode_ci DEFAULT NULL,
    `body` text COLLATE utf8_unicode_ci,
    PRIMARY KEY (`article_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

   
我做错了什么?
请帮忙。


看起来,问题更复杂。
我无法使用 PDO 执行任何在 DB 中写入内容的操作。
我可以查询 DB 和“读取”值,但如果我使用 INSERT 或 UPDATE,什么都不会发生。
我在 64 位操作系统上使用 WampServer 2.1。
我可以在没有 PDO 的情况下使用 mysql 查询、获取等来做到这一点......

【问题讨论】:

    标签: php mysql insert pdo


    【解决方案1】:

    您应该使用准备好的语句而不是那些疯狂的查询创建代码。 比如:

    $stmt = $pdo_object->prepare('INSERT INTO `articles` (sort_id, visible, title, body)
                VALUES (:id, :visible, :title, :body)');
    $stmt->execute(array(':id' => $sort_id,
                         ':visible' => $visible,
                         ':title' => $title,
                         ':body' => $body));
    

    它会阻止你不想要的讨厌的SQL injection

    要查看您可能遇到的 SQL 错误,请调用 $pdo_object->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);,以便在出现错误时抛出异常。不要在生产环境中这样使用它,因为它会在异常消息中提供您的数据库登录名和密码。

    我还建议您在代码周围使用transactions,这样如果同时创建多篇文章,您就不会使用相同的 sort_id。

    public function createArticle($pdo_object, $title, $body, $visible, $incerase_sort_id=2){
      $pdo_object->beginTransaction();
      try{
        $return=$this->findMaxSortId($pdo_object);
        $sort_id=$return['max_id']+$incerase_sort_id;
    
        $stmt = $pdo_object->prepare('INSERT INTO `articles` (sort_id, visible, title, body)
                    VALUES (:id, :visible, :title, :body)');
        $stmt->execute(array(':id' => $sort_id,
                             ':visible' => $visible,
                             ':title' => $title,
                             ':body' => $body));
        $return['id']=$pdo_object->lastInsertId();
      }catch(Exception $e){
        $pdo_object->rollBack();
        return null;
      }
      $pdo_object->commit();
      return $return;
    }
    

    【讨论】:

    • 我已经尝试过准备好的语句,结果是一样的。但我用问号试了一下。我会检查它并让你知道。我也会检查 ERRMODE。感谢交易方面的建议,我将在其他项目中使用它,但正如我所写的那样,这个项目很简单,会有 10-15 篇文章,所以我认为它会一劳永逸地排序;)这将是我的网站把其他网站的 XML 附属程序规范(XML、实现等)。我大概会在 6 个月内修改一次。
    【解决方案2】:

    这是错误的:

        $pdo_object->exec("
            INSERT INTO `articles` (sort_id, visible, title, body)
            VALUES (`".$sort_id."`, `".$visible."`, `".$title."`, `".$body."`)
        ");
    

    你应该用单引号或双引号替换反引号:

        $pdo_object->exec("
            INSERT INTO `articles` (sort_id, visible, title, body)
            VALUES ('".$sort_id."', '".$visible."', '".$title."', '".$body."')
        ");
    

    反引号用于表名和字段名。

    【讨论】:

    • @Jon Stirling & sanmai 你是对的,但这是我组合的结果;) 引号是第一选择,我应该以这种形式发布代码,但我更改了很多次,只是忘了更改它回来了
    • 我只是将那些反引号改为引号。只是为了不误导他人。
    【解决方案3】:

    在处理值时,尝试将 INSERT INTO 中的反引号替换为引号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 2017-07-06
      • 1970-01-01
      • 2014-03-20
      • 2017-04-12
      相关资源
      最近更新 更多