代码之家  ›  专栏  ›  技术社区  ›  Alexander Farber

在php脚本中,insert语句会自动失败,但会在提示下工作

  •  2
  • Alexander Farber  · 技术社区  · 15 年前

    我在PostgreSQL 8.4.5中有下表:

    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
    

    但由于某种原因,在下面列出的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>
    

    当做, 亚历克斯

    附言:这是我目前的剧本,看起来不错-

    <?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>
    ';
    }
    
    ?>
    
    1 回复  |  直到 15 年前
        1
  •  3
  •   lonesomeday    15 年前

    PDOStatement->insert() 使用参数数组,而不是多个参数:

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

    the manual .