一个PHP文件中有多个MySQL查询

时间:2017-09-16 07:34:15

标签: php mysql pdo

我正在尝试创建一个PHP文件,该文件可以根据通过POST发送的数据执行不同的MySQL查询。如果我在执行MySQL查询的switch语句中添加另一个案例,我会收到致命错误:在null上调用成员函数prepare()。 connection.php包含$ conn。

我真的不知道,为什么会发生这种情况,所以如果有人可以提供帮助,我会很高兴:)

require_once('connection.php');

function namecheck($conn, $username)
{
    try {
        $sql = "SELECT username FROM users WHERE username = ?";
        $stmt = $conn->prepare($sql);
        $stmt->execute(array($username));
        $result = $stmt->fetch();
    } catch (PDOException $e) {
        return $sql . "<br>" . $e->getMessage();
    }

    $conn = null;

    if ($result !== false) {
        return True;
    } else {
        return False;
    }
}

if (isset($_POST['action']) && !empty($_POST['action'])) {
    $action = $_POST['action'];
    switch ($action) {

        case 'namecheck': //works
            $username = $_POST['username'];
            $result = namecheck($conn, $username);
            if ($result == True) {
                echo 'True';
            } elseif ($result == False) {
                echo 'False';
            }

        case 'adduser': //script still works
            $first_name = $_POST['first_name'];
            $last_name = $_POST['last_name'];
            $username = $_POST['username'];
            $password = $_POST['password'];

            try {
                $sql = "INSERT INTO users (username, password) VALUES (?, ?)";
                $stmt = $conn->prepare($sql);
                $stmt->execute(array($username, $password));
            } catch (PDOException $e) {
                return $sql . "<br>" . $e->getMessage();
            }
            $conn = null;

        case 'test': //Same as above. if added, fatal error
            $first_name = $_POST['first_name'];
            $last_name = $_POST['last_name'];
            $username = $_POST['username'];
            $password = $_POST['password'];

            try {
                $sql = "INSERT INTO users (username, password) VALUES (?, ?)";
                $stmt = $conn->prepare($sql);
                $stmt->execute(array($username, $password));
            } catch (PDOException $e) {
                return $sql . "<br>" . $e->getMessage();
            }
            $conn = null;
    }
}

2 个答案:

答案 0 :(得分:0)

您的案例块中没有break语句。当&#34; adduser&#34;案件执行,控制进入&#34;测试&#34;并且$conn在那里为空

https://www.tutorialrepublic.com/php-tutorial/php-switch-case-statements.php

case 'test':替换为以下内容:

break;
case 'test':

答案 1 :(得分:0)

  

如果我在执行MySQL查询的switch语句中添加另一个案例,我会收到致命错误:在null上调用成员函数prepare()。

那是因为你在每个案例中执行$conn = null;语句,主要是因为你的switch案例中没有break;语句。如果没有任何break;语句,将执行所有下游情况(从匹配点开始)。所以你的代码块应该是这样的:

if(isset($_POST['action']) && !empty($_POST['action'])) {
    $action = $_POST['action'];
    switch($action){
        case 'namecheck': 
            ...
            break;
        case 'adduser': 
            ...
            break;
        case 'test':
            ...
            break;
    }
}