通过PHP PDO INSERT到MySQL表的问题

时间:2011-09-15 09:39:52

标签: php mysql insert pdo


我创建了简单的应用程序,第一次使用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);
}


db中的文章表:

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查询,获取等...

3 个答案:

答案 0 :(得分:3)

您应该使用预准备语句而不是那些疯狂的查询创建代码。 类似的东西:

$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;
}

答案 1 :(得分:1)

这是错误的:

    $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."')
    ");

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

答案 2 :(得分:0)

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