在SQL查询中使用php函数的参数作为列名


Use parameter of php function as column name in SQL query

这是一个学校项目。我是PHP和MySQL的新手。我正在尝试用PHP编写一个带有一个字符串参数的函数,该参数将成为SQL查询的列名,该查询用于该函数中的prepare()语句。

这是代码:

function checkCredentials($dbFieldToCheck) {
  $statement = $conn->prepare("SELECT id FROM user WHERE ".$dbFieldToCheck." = ? AND password = PASSWORD(?)");
  if (!$statement) die("Prepare failed: (" . $conn->errno . ") " . $conn->error);
  $statement->bind_param("ss", $_POST["username/email"], $_POST["password"]);
  $statement->execute();
  $result = $statement->get_result();
  $row = $result->fetch_assoc();
  return $row;
}

然后我在两个不同的变量中调用这个函数两次:

$row1 = checkCredentials('email');
$row2 = checkCredentials('username');

最后,我用这两个变量做了一些事情(我想在这里没有用)。

我已经尝试了在SQL语句中写入参数的不同方法,也尝试了在函数调用中写入它的不同方法。现在我甚至开始认为我的函数根本没有被调用。。。

如果我只执行函数内部的代码两次,并且对列名进行硬编码,那么我想要实现的目标就会实现。但这并不好:)

非常感谢您的帮助。谢谢

将提交的POST数据和连接变量添加到函数的参数中。当你调用你的函数时,它会像这样:

checkCredentials($dbFieldToCheck, $conn, $_POST["username/email"], $_POST["password"]);

你的功能看起来像这样:

function checkCredentials(string $dbFieldToCheck, $conn, $username, $password) {
    $statement = $conn->prepare("SELECT id FROM user WHERE ".$dbFieldToCheck." = ? AND password = PASSWORD(?)");
    if (!$statement) die("Prepare failed: (" . $conn->errno . ") " . $conn->error);
    $statement->bind_param("ss", $username, $password);
    $statement->execute();
    $result = $statement->get_result();
    $row = $result->fetch_assoc();
    return $row;
}

您可以使用global来调用函数内部的变量(您可以参考此处了解使用global的缺点)。

我的猜测是,您的函数不知道$conn,因为它没有在其作用域中声明
你的功能应该这样开始:

global $conn;

有关变量范围的更多信息,请参阅手册。

编辑:

正如apokryfos在评论中指出的那样,不建议使用global。最好将$conn作为参数传递给checkCredentials

有关详细信息,请参阅此问题的公认答案。报价:

函数调用不应该依赖之外的任何东西

我想你可以这样修改你的代码:

$servername = "localhost:3306";//replace with your mysql server address
$username = "username";//replace with your mysql user
$password = "password";//replace with your mysql password
// Create connection
$conn = new mysqli($servername, $username, $password);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";

function checkCredentials(string $dbFieldToCheck, $conn, $username, $password) {
    $statement = $conn->prepare("SELECT id FROM user WHERE ".$dbFieldToCheck." = ? AND password = PASSWORD(?)");
    if (!$statement) die("Prepare failed: (" . $conn->errno . ") " . $conn->error);
    $statement->bind_param("ss", $username, $password);
    $statement->execute();
    $result = $statement->get_result();
    $row = $result->fetch_assoc();
    return $row;
}
checkCredentials('email');

将PHP与MYSQL结合使用并不复杂,本文档可以帮助您了解它们如何协同工作的基本概念(http://www.w3schools.com/php/php_mysql_connect.asp)。