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

在SQL查询中使用php函数的参数作为列名,php,mysql,sql,Php,Mysql,Sql,这是一个学校项目。我是PHP和MySQL的新手。 我正在尝试用PHP编写一个带有一个字符串参数的函数,该参数将成为SQL查询的列名,该查询在该函数内的prepare()语句中使用 代码如下: function checkCredentials($dbFieldToCheck) { $statement = $conn->prepare("SELECT id FROM user WHERE ".$dbFieldToCheck." = ? AND password = PASSWORD(?

这是一个学校项目。我是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语句中写入参数的不同方法,也尝试了在函数调用中写入参数的不同方法。现在我甚至开始认为我的函数根本没有被调用

如果我用硬编码的列名在函数中执行两次代码,我想要实现的就是工作。但这并不好:)


非常感谢您的帮助。谢谢

我猜您的函数不知道
$conn
,因为它没有在其范围内声明。
您的函数应该这样开始:

global $conn;
有关变量范围的更多信息,请参阅

编辑:

正如评论中所指出的,不建议使用
全局
。最好将
$conn
作为参数传递给
checkCredentials

有关详细信息,请参阅。引述:

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


将提交的
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;

}
$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');
您的函数将如下所示:

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;

}
$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');

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

我想您可以这样修改代码:

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;

}
$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结合使用并不复杂,本文档可以帮助您了解它们是如何协同工作的
()。

首先检查函数中
$conn
的值。您可能在函数外部声明了
$conn
。您可以使用
global$conn
调用函数中的变量。切勿存储纯文本密码!请使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用
密码\u hash()
。在散列之前,请确保您在它们上安装或使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。@Jay Blanchard。是的,我知道。实际上,我删除了密码旁边的一条评论,上面写着“不要这样做,这是生产!”:)谢谢你的链接。不建议使用
global
。最好将
$conn
变量作为参数传递。您为什么要猜?谢谢,这很有效。出于某种原因,我还必须删除函数签名中的“string”类型,它才能工作。你猜呢?你为什么要猜?