如何在PHP函数中执行SQL查询

时间:2015-09-05 20:50:12

标签: php mysql function

我正在尝试执行此功能:

<?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));

        }
?>

但是当我调用该函数时,该函数根本不起作用。我希望你们能帮助我。感谢

1 个答案:

答案 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)在您的应用程序的其他部分重用此功能。