PDO数据没有插入数据库没有错误

时间:2013-08-08 07:52:34

标签: pdo

    $query2="insert into `articles` set article_title=:article,user_name=:user,post_id=:postid      article_content=:articlecontent,article_rank=:rank,add_date=:date,article_100img=:article_100,articl    e_200img=:article_200,article_400img=:article_400,artcle_600img=:article_600,article_slug=:slug";
    $stmt=$db->prepare($query2);
    $stmt->bindParam(':article',$article_title);
    $stmt->bindParam(':articlecontent',$article_desc);
    $stmt->bindParam(':rank',$rank);
    $stmt->bindParam(':date',$date);
    $stmt->bindParam(':article_100',$x100img);
    $stmt->bindParam(':article_200',$x200img);
    $stmt->bindParam(':article_400',$x400img);
    $stmt->bindParam(':article_600',$x250img);
    $stmt->bindParam(':slug',$slug);
    $stmt->bindParam(':user',$name);
    $stmt->bindParam(':postid',$id);
    $stmt->execute();

我不知道这段代码有什么问题。所以请帮助我。

1 个答案:

答案 0 :(得分:2)

为了能够查看数据库错误,必须将PDO errmode设置为异常。异常在许多方面优于常规错误:它们总是包含堆栈跟踪,可以使用try..catch捕获它们或使用专用错误处理程序处理它们。甚至未处理,它们充当常规PHP错误,提供所有重要信息,遵循站点范围的错误报告设置。

请注意,将此模式设置为连接选项会让PDO也会对连接错误抛出异常,这非常重要 因此,这是一个以正确方式创建PDO连接的示例:

$dsn = "mysql:host=$host;dbname=$db;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    // other options 
);
$pdo = new PDO($dsn, $user, $pass, $opt);

以这种方式连接,将始终通知您在查询执行期间发生的所有数据库错误。请注意,您必须能够查看PHP错误。在实际站点上,您必须查看错误日志,因此,必须设置

error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);

在本地开发服务器上,可以在屏幕上显示错误:

error_reporting(E_ALL);
ini_set('display_errors',1);

当然,您永远不应该在PDO语句前使用错误抑制运算符(@)。

此外,由于许多不良示例告诉您将每个PDO语句包装到try..catch块中,我必须做一个明确的说明:

  

请勿使用try..catch运算符来回显错误消息。未捕获的异常已经很好用于此目的,因为它的行为方式与其他PHP错误相同 - 所以,你可以使用站点范围的设置来定义行为 - 因此,您将收到错误消息而没有此无用的代码。 虽然无条件回显的错误消息可能会向潜在的攻击者泄露一些敏感信息,但会混淆一个诚实的访客。

     
      
  • 以后可以添加custom exception handler,但不是必需的。特别是对于新用户,建议使用未处理的异常,因为它们提供的信息非常丰富,有用且安全。
  •   
  • 仅当您要处理错误本身时才使用try..catch - 例如,回滚事务。
  •   

另外,我发现article_XXX字段非常无用。你不能制作这些图像名称computational吗?比方说,对于文章id = 100500,100图像将是100500_100.jpg?