我正在尝试执行此功能:
<?php
function registerDevice(){
$query = "INSERT INTO devices (device,username) VALUES (:device,:username)";
$query_params = array(
':device' => $_POST['device'],
':username' => $_POST['username'],
);
try {
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch (PDOException $ex) {
$response["success"] = 0;
$response["result"] = "Error154";
die(json_encode($response));
}
}
registerDevice();
?>
如果在函数外部没有被调用,该方法可以成功运行:
<?php
$query = "INSERT INTO devices (device,username) VALUES (:device,:username)";
$query_params = array(
':device' => $_POST['device'],
':username' => $_POST['username'],
);
try {
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch (PDOException $ex) {
$response["success"] = 0;
$response["result"] = "Error154";
die(json_encode($response));
}
?>
但是当我调用该函数时,该函数根本不起作用。我希望你们能帮助我。感谢
答案 0 :(得分:4)
密钥是$db
变量。你永远不会展示它是如何初始化的:我假设它是由一些外部(require
)文件创建的,该文件负责创建与DB的连接并将其存储到$db
var中。由于文件边界不在PHP中创建单独的作用域,因此该变量保留在全局作用域中。
这不是一个好习惯,但是当使用$db
的代码也放在全局范围内时,它可以正常工作。但是当代码被移动到一个函数中时它会中断,这会引入一个新的 - 隔离范围。
(我建议检查this question及其答案,它解释了很多关于PHP的复杂性;相信我,有一些)
摆脱这种混乱的一种可能方法是将$db
变量的值明确地传递给registerDevice
函数作为其参数。这显然需要更改签名:
function registerDevice($db) {
// ... the rest of the code is the same
}
registerDevice($db);
请注意,$_POST
变量是一个不同的野兽。实际上,其中更多的是$_GET
,$_SERVER
等等,这些野性的东西也被称为PHP superglobals。无论何时引入新范围,您都可以安全地(在某种程度上)在代码的任何部分中使用它们。毕竟,这就是为什么他们称之为超全球的原因。
尽管如此,即使掌握了所有权力,调整你的功能可能是一个好主意,这样它就不会依赖任何魔法:
function registerDevice($db, $deviceId, $username) {
// ... the code is the same
}
if (isset($_POST['device'], $_POST['username'])) {
registerDevice($db, $_POST['device'], $_POST['username']);
}
else {
// something is not right with the request
}
此更改似乎无关紧要,但现在您的函数可以从任何源获取输入,从而更接近真正的自治实体。除其他外,这允许您1)在隔离中测试此功能; 2)在您的应用程序的其他部分重用此功能。