2016-05-12 5 views
2

Это для школьного проекта. Я новичок в PHP и MySQL. Я пытаюсь написать функцию в PHP с одним строковым параметром, который станет именем столбца SQL-запроса, который используется в выражении prepare() внутри этой функции.Использовать параметр php как имя столбца в SQL-запросе

Вот код:

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 и другие способы записи его в вызов функции. Теперь я даже начинаю думать, что моя функция даже не называется вообще ...

Что я хочу достичь, если я просто выполняю код внутри функции два раза с именем столбца, жестко закодированным. Но это не приятно :)

Любая помощь очень ценится. Благодаря!

+0

Начните с проверки значения '$ conn' в вашей функции. –

+0

Возможно, вы указали '$ conn' вне вашей функции. Вы можете использовать 'global $ conn' для вызова переменной внутри вашей функции. –

+1

** Никогда не храните простые текстовые пароли! ** Для обеспечения безопасности паролей используйте встроенные функции PHP (http://jayblanchard.net/proper_password_hashing_with_PHP.html). Если вы используете версию PHP менее 5.5, вы можете использовать 'password_hash()' [пакет совместимости] (https://github.com/ircmaxell/password_compat). Убедитесь, что вы [не избегаете паролей] (http://stackoverflow.com/q/36628418/1011527) или используйте какой-либо другой механизм очистки для них перед хэшированием. Выполнение этого * изменяет * пароль и вызывает ненужное дополнительное кодирование. –

ответ

3

Добавить в параметр вашей функции представленных 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).

+0

спасибо, что это сработало. По какой-то причине мне также пришлось удалить тип «строка» в моей сигнатуре функции, чтобы она работала. –

0

Я предполагаю, что ваша функция не знает о $conn, потому что она не была объявлена ​​в ее объеме.
Ваша функция должна начинаться так:

global $conn; 

См the manual для получения дополнительной информации о переменной области.

EDIT:

Как apokryfos отметил в комментариях, использование global не рекомендуется. Лучше было бы передать $conn в качестве параметра checkCredentials.

Для получения более подробной информации см. the accepted answer to this question. Цитата:

Вызов функция не должен полагаться на что-либо за пределами

+5

Использование 'global' не рекомендуется. Лучше передать переменную '$ conn' в качестве параметра. – apokryfos

+0

Почему вы угадываете? –

0

Я думаю, вы можете изменить свой код так:

$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).

+0

Вы догадываетесь? Почему вы догадались? –

Смежные вопросы