Подготовленные операторы
Хорошо, я только начал смотреть на подготовленные операторы MySQLi.Это был большой шаг для меня, так как я в любом случае очень плохо знаком с MySQL и PHP, поэтому у меня очень слабое понимание концепции (возможно, около часа), поэтому ваши ответы должны быть сформулированы аналогично, извините за это,
Я хочу знать, правильно ли я пишу подготовленное заявление.Нет ничего хуже, чем изучить неправильный метод и привыкнуть к нему, поэтому неэффективно кодировать целые проекты.
Кстати, у меня есть функция, которая регистрирует пользователя, а затем возвращает вставленный идентификатор, который, следовательно, является ссылочным идентификатором пользователя.
Раньше я просто запрашивал базу данных.Мне сказали, что у нее были угрозы безопасности, несмотря на использование mysql_real_escape_string()
и аналогичных мер безопасности.
Теперь это выглядит примерно так: (предположим, ради этого вопроса, что все ссылочные переменные определены, связанные параметры являются строками, а все вызываемые функции существуют и работают).
function registerUser($username, $fname, $email, $password, $region, $activation) {
$uniqueSalt = uniqueSalt();
$password = sha1($uniqueSalt . $password);
$mysqli = mysqli_connect('localhost', 'root', '', 'database');
if ($stmt = $mysqli->prepare("INSERT INTO `users` VALUES('', ?, ?, ?, ?, '$password', '$uniqueSalt', '$activation')") ) {
$stmt->bind_param("ssss", $username, $fname, $email, $region);
$stmt->execute();
$stmt->close();
} else {
echo 'error preparing statement';
}
return mysqli_insert_id($mysqli);
}
Вопросы
Кажется, что это работает, но:
1) Это правильный синтаксис для выполнения подготовленного оператора?
2) Я включил файл, в котором находилась эта функция (назовите его function.php), в другой файл с именем init.php, который ранее определил переменную $mysqli
.Я обнаружил, что если бы я не включил
$mysqli = mysqli_connect('localhost', 'root', '', 'database');
, я получил бы ошибку.Почему я должен был переопределить его внутри функции?
3) Когда я ранее заканчивал функцию, прежде чем использовал предварительно подготовленные операторы, с return mysql_insert_id()
, который работал нормально, теперь я обнаружил, что должен использовать mysqli_insert_id($mysqli)
.
Если я не включу $mysqli
в скобки, я получу ошибку mysqli_insert_id() expects exactly 1 parameter, 0 given
.Почему это так и почему оно отличается от того, что у меня было раньше?
Приветствия, Люк.