2012-04-04 127 views
0

这是我在这个网站,所以我很抱歉提前如果有些东西在格式化:)转换失败

出来怪异约后的第一篇文章一周搜索互联网寻找这个问题的答案我想我会给这个网站一个尝试,因为它帮助我无数次在过去。

无论如何,我最近开始使用PHP中的PDO与我一直在研究的项目中的MS SQL数据库进行交互。其中一个表的设置方式基本上都是数字,日期时间和字符字段。我的问题是与日期字段。我正在编写的脚本是从一个表中复制一行并将其放入另一个具有其自己的ID的文本中 - 我得到的错误是因为原始表具有NULL值,因为该表中的数据变化很大,的字段是NULL。

为了解决这个问题,我尝试了很多不同的方法来获得NULL值,我写了一个函数,它用零代替所有的空值。这工作正常,除了日期值 - 注释它们之后插入语句的工作,因为它应该 - 然而,他们在我得到“转换日期时间从字符串转换失败。”错误,可能是因为数据库无法将'0'转换为日期时间值。

我该如何解决这个问题?

这是替换NULL值的函数。我觉得我也应该注意到,如果我只保留值NULL,我会得到一个错误转换数据类型nvarchar为数字。错误。

function check_empty($field, $slno){ 
try{ 
    require("assets/dbcnct.php"); 

    $stmt = $DBH->prepare(" select ". $field ." from timeticket where slno = :slno "); 

    $stmt->bindParam(':slno', $slno); 

    $stmt ->execute(); 

    $result = $stmt->fetch(PDO::FETCH_ASSOC); 

    echo "<pre>"; 
    var_dump($result); 
    echo "</pre>"; 

    foreach($result as $key=>$val){ 
      if(empty($val)){ 
        $val = 0; 
      } 
    } 
    return trim($val); 

} 
catch(PDOException $e) { 
    echo "<pre>"; 
    echo $e->getMessage(); 
    echo "</pre>"; 
}  

}

+0

只是要清楚:如果日期为NULL,应该插入目标表中的什么?你是否需要在复制时用空字符串或'0'代替NULL,或者你的目标表中是否只有'NULL'值? – Basti 2012-04-04 23:02:32

回答

0

欢迎计算器! :-)

设置默认值NULL

你可以做

SELECT IFNULL(`myColumn`, 'default value for this column') as `myColumn` ... 

为一列设置默认值,如果是NULL。如果不是NULLdefault value for this column,则返回值为myColumn

例子:获取当前的日期,如果在表中的日期表之间NULL

SELECT IFNULL(`myDateColumn`, NOW()) as `myDateColumn` ... 

复制的元组在MySQL

我也认为你不需要PHP复制的元组从一张桌子到另一张桌子。请参阅MySQL的INSERT INTO SELECT

示例:假设你有sourcedestination都与一个自动递增主键id和列date允许NULL值。

INSERT INTO `destination` (`id`, `date`) SELECT NULL, `date` FROM `source` 

这将从表source选择所有date S和它们插入到destination创建一个新的ID,每个新创建的元组。这也将保留NULL值。

这是在表之间复制元组的首选解决方案。因为没有数据实际上在MySQL和PHP之间传输,所以即使对于大量的元组,这也将非常快。