我不是一个PHP开发人员,但我已经交给了一些遗留的PHP代码,我必须修复错误。我将用C#重写这段代码,所以我只需要理解为什么它在我认为应该失败的时候没有失败。
首先,实例化一个数据库对象并构建一个SQL查询:
$dbh = new PDO('pgsql:dbname=' . $dbname . ';host=' . $host, $dbuser, $dbpass, array(
PDO::ATTR_PERSISTENT => true
));
$db2 = new PDO('pgsql:dbname=' . $dbname . ';host=' . $host, $dbuser, $dbpass, array(
PDO::ATTR_PERSISTENT => true
));
$sql = "select b.uniqueid,b.name,";
$sql .= " a.id,a.servertime,a.devicetime,a.latitude,a.longitude,speed,course,accuracy";
$sql .= " from tc_positions a, tc_devices b";
$sql .= " where a.deviceid = b.id and a.processed = 0";
$sql .= " order by a.devicetime";然后,执行SQL查询,并分别处理记录:
$stmt = $dbh->query($sql);
$x = 0;
while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
$x++;
try {
$gps = new GpsDevice(array('identity' => $data['uniqueid']));
} catch (fNotFoundException $e) {
$gps = new GpsDevice();
$gps->setIdentity($data['uniqueid']);
$gps->setComments('Tracker->' . $data['name']);
$gps->store();
}
// begin functions under question
$loc = new GpsDeviceLocation();
$loc->setGpsDeviceId($gps->getGpsDeviceId());
$loc->setCreated($data['devicetime'] . ' +00');
$loc->setReceived($data['servertime'] . ' +00');
$loc->setLat($data['latitude']);
$loc->setLon($data['longitude']);
$loc->setHeading($data['course']);
$loc->setSpeed($data['speed'] / 1.60934);
$loc->setAccuracy($data['accuracy']);
// end functions in question
$loc->store();
$loc->free();
$loc = null;
$gps->free();
$gps = null;
print($data['uniqueid'] . "\n");
$sql2 = 'update tc_positions set processed = 1 where id = ' . $data['id'];
$db2->query($sql2);
}因为我不是PHP开发人员,所以我只能依靠我有限的PHP知识和PHPStorm来帮助我理解正在发生的事情。将$loc设置为GpsDeviceLocation的一个新实例,该实例是一个类,构建方式如下:
// using flourish-classes
class GpsDeviceLocation extends fActiveRecord { }我不明白的是,当这个位被调用时,$loc->setGpsDeviceId($gps->getGpsDeviceId()); (以及其他有问题的方法),没有匹配的方法。通常,在Python或C#中,在执行或编译时会抛出一个异常,但代码没有抛出任何错误,脚本正在按预期运行,我已经在下游数据库中验证了记录正在按预期进行处理。我已经搜索了代码库,除了该文件之外,没有任何方法的引用。
我觉得应该抛出一个异常,但没有。据我所知,这段代码应该失败,但它没有,我不明白为什么。PHP 5.3中缺少方法的行为是什么?
发布于 2020-09-09 02:49:28
通过方法和约定的名称,它使用Symfony 1或类似的东西是有问题的。它是一个PHP框架,它有一些自定义的函数,比如getGpsDeviceId,这个框架知道它需要返回字段gps_device_id或id_device_gps,它们使用的是旧的ORM,这些函数都是自动创建的。PHP Storm可能不会告诉你代码在哪里,因为它是一个非常古老的东西,人们没有开发一个插件来回溯它。要了解应用程序正在做什么,我建议您查找描述架构的文件,如composer.json或require()函数,在找到框架后,您可以查看官方网站上的文档。
Symfony 1的示例:https://symfony.com/legacy/doc/gentle-introduction/1_4/en/01-Introducing-Symfony
https://stackoverflow.com/questions/63799678
复制相似问题