2011-09-15 39 views
0


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

现在我有:

类文章:
问题的插入到MySQL表,由PHP PDO

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和“读取”值,但是如果我使用INSERT或UPDATE,则什么也没有发生。
我在64位操作系统上使用WampServer 2.1。
我可以在没有PDO的情况下执行此操作,使用mysql查询,提取等操作。

回答

0

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

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

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

+0

@乔恩斯特林和sanmai你是对的,但是这是我的组合结果;)报价为第一选择,以这种形式我应该张贴的代码,但我改变了很多次,只是忘了改回来 – tomiozo

+0

我只是将这些反引号改为引号。只是为了不误导别人。 – tomiozo

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; 
} 
+0

我已经试过准备好的陈述,结果是一样的。但我用问号试了一下。 我会检查它并让你知道。我也会检查ERRMODE。 感谢您对交易的建议,我会在其他项目中使用它,但是由于我写这个项目很简单,因此会有10-15篇文章,所以我会认为这将被整理一次,并且是所有的;) This will be网站,我把其他网站XML联盟计划规范(XML,实施等)。我会在6个月内修改一次。 – tomiozo