2010-10-17 161 views
2

我有PostgreSQL的8.4.5下表的工作原理:INSERT语句就会失败在PHP脚本,但在提示

snake=> create table gps (
id bytea check(length(id) = 16), 
stamp timestamp DEFAULT current_timestamp, 
pos point not null); 

,我能插入记录到它在psql提示:

snake=> insert into gps (id, pos) values (decode(md5('x'), 'hex'), point(0, 0)); 
INSERT 0 1 
snake=> insert into gps (id, pos) values (decode(md5('x'), 'hex'), point(0, 0)); 
INSERT 0 1 

但由于某种原因,INSERT在我下面列出的PHP脚本中失败,其结果返回为0.有没有人有一个想法有什么错误或如何获取更多信息?我很惊讶不会抛出异常。

<?php 

$id = trim($_REQUEST['id']); 
$lat = strtr(trim($_REQUEST['lat']), ',', '.'); 
$lon = strtr(trim($_REQUEST['lon']), ',', '.'); 

if (preg_match('/^[a-fA-F0-9]{32}$/', $id) && 
    preg_match('/^[+-]?[0-9.]+$/', $lat) && 
    preg_match('/^[+-]?[0-9.]+$/', $lon)) { 

     try { 
       $db = new PDO('pgsql:host=/tmp', 'snake', 'snake'); 
       $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

       $insert = $db->prepare("insert into gps (id, pos) values (decode(?, 'hex'), point(?, ?))"); 
       $res = $insert->execute($id, $lat, $lon); 

       $select = $db->prepare("select encode(id, 'hex') as id, extract('epoch' from stamp) as stamp, pos[0] as lat, pos[1] as lon from gps"); 
       $select->execute(); 

       header('Content-Type: text/xml; charset=utf-8'); 
       print '<?xml version="1.0"?><gps>'; 
       while ($row = $select->fetch(PDO::FETCH_ASSOC)) { 
         printf('<pos id="%s" stamp="%u" lat="%f" lon="%f" />', 
          $row['id'], $row['stamp'], $row['lat'], $row['lon']); 
       } 
       printf('<res val="%d" />', $res); 

       print '</gps>'; 
     } catch (Exception $e) { 
       print 'Database problem: ' . $e->getMessage(); 
     } 

} else { 
     header('Content-Type: text/html; charset=utf-8'); 
     print '<html> 
<body> 
<form method="post"> 
<p>Id: <input type="text" name="id" size=32 maxlength=32 /></p> 
<p>Latitude: <input type="text" name="lat" /></p> 
<p>Longitude: <input type="text" name="lon" /></p> 
<p><input type="submit" value="Save" /></p> 
</form> 
</body> 
</html> 
'; 

} 

?> 

我得到这表明结果为0,输出:

<gps> 
<pos id="0cc175b9c0f1b6a831c399e269772661" stamp="1287306960" lat="51.000000" lon="7.000000"/> 
<pos id="0cc175b9c0f1b6a831c399e269772661" stamp="1287323377" lat="51.000000" lon="7.000000"/> 
<pos id="92eb5ffee6ae2fec3ad71c777531578f" stamp="1287323381" lat="51.000000" lon="7.000000"/> 
<pos id="92eb5ffee6ae2fec3ad71c777531578f" stamp="1287323442" lat="51.300000" lon="7.000000"/> 
<pos id="92eb5ffee6ae2fec3ad71c777531578f" stamp="1287325610" lat="51.300000" lon="7.000000"/> 
<pos id="92eb5ffee6ae2fec3ad71c777531578f" stamp="1287325612" lat="51.300000" lon="7.000000"/> 
<pos id="9dd4e461268c8034f5c8564e155c67a6" stamp="1287325692" lat="0.000000" lon="0.000000"/> 
<res val="0"/> 
</gps> 

问候, 亚历

PS:这里是我当前的脚本,似乎就ok了工作 -

<?php 

$id = trim($_REQUEST['id']); 
$lat = strtr(trim($_REQUEST['lat']), ',', '.'); 
$lng = strtr(trim($_REQUEST['lng']), ',', '.'); 

if (preg_match('/^[a-fA-F0-9]{32}$/', $id) && 
    preg_match('/^[+-]?[0-9.]+$/', $lat) && 
    preg_match('/^[+-]?[0-9.]+$/', $lng)) { 

     try { 
       # enable persistent connections and throw exception on errors 
       $options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
           PDO::ATTR_PERSISTENT => true); 

       $db = new PDO('pgsql:host=/tmp dbname=snake', 'snake', 'snake', $options); 

       #$db->exec('create table gps (id bytea check(length(id) = 16), stamp timestamp DEFAULT current_timestamp, pos point not null)'); 

       $insert = $db->prepare("insert into gps (id, pos) values (decode(?, 'hex'), point(?, ?))"); 
       $insert->execute(array($id, $lat, $lng)); 

       $select = $db->prepare("select encode(id, 'hex') as id, extract('epoch' from stamp) as stamp, pos[0] as lat, pos[1] as lng from gps"); 
       $select->execute(); 

       header('Content-Type: text/xml; charset=utf-8'); 
       print '<?xml version="1.0"?><gps>'; 
       while ($row = $select->fetch(PDO::FETCH_ASSOC)) { 
         printf('<pos id="%s" stamp="%u" lat="%f" lng="%f" />', 
          $row['id'], $row['stamp'], $row['lat'], $row['lng']); 
       } 
       print '</gps>'; 
     } catch (Exception $e) { 
       print 'Database problem: ' . $e->getMessage(); 
     } 

} else { 
     header('Content-Type: text/html; charset=utf-8'); 
     print '<html> 
<body> 
<form method="post"> 
<p>Id: <input type="text" name="id" size=32 maxlength=32 /></p> 
<p>Latitude: <input type="text" name="lat" /></p> 
<p>Longitude: <input type="text" name="lng" /></p> 
<p><input type="submit" value="Save" /></p> 
</form> 
</body> 
</html> 
'; 
} 

?> 
+0

你是否收到任何错误信息?你是否使用相同的用户名表单命令行和脚本? – Piskvor 2010-10-17 15:34:40

+0

这不会导致你的问题,但我想注意到这个错误。在数字匹配中您有[0-9。],那个点(。)表示“任何字符”。您需要将其转义为[0-9 \。],因此它只是匹配一段时间。 – 2010-10-17 15:42:24

+1

@Conspicuous元字符除''\^- '是字符类中的常规字符,所以这不是问题。 – lonesomeday 2010-10-17 15:51:21

回答

3

我相信你需要使用一组参数来做PDOStatement->insert(),不是多个参数:

$res = $insert->execute($id, array($lat, $lon)); 

the manual

+0

就是这样,谢谢!奇怪的是,没有抛出异常 – 2010-10-17 16:48:01

+0

[手册页](http://www.php.net/manual/en/pdo.setattribute.php#71281)有一条评论:“设置PDO :: ATTR_ERRMODE属性到PDO :: ERRMODE_EXCEPTION只为我用Mysql 4.x工作 - 我花了一些时间来解决这个问题;-)“也许这是原因? – lonesomeday 2010-10-17 19:54:54