Запрос может быть неудачным по различным причинам, и в этом случае оба mysql_ * и расширение mysqli вернут false
из своих соответствующих функций / методов запроса. Вам нужно проверить это условие ошибки и обработать его соответствующим образом.
ПРИМЕЧАНИЕ Функции mysql_ устарели и были удалены в версии 7 php.
blockquote>Перед передачей
mysql_fetch_array
проверьте$result
. Вы обнаружите, что этоfalse
, потому что запрос завершился неудачно. См. Документациюmysql_query
для возможных возвращаемых значений и предложений о том, как с ними обращаться.$username = mysql_real_escape_string($_POST['username']); $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'"); if($result === FALSE) { die(mysql_error()); // TODO: better error handling } while($row = mysql_fetch_array($result)) { echo $row['FirstName']; }
расширение mysqli процедурный стиль :
$username = mysqli_real_escape_string($mysqli, $_POST['username']); $result = mysqli_query($mysqli, "SELECT * FROM Users WHERE UserName LIKE '$username'"); // mysqli_query returns false if something went wrong with the query if($result === FALSE) { yourErrorHandler(mysqli_error($mysqli)); } else { // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach foreach( $result as $row ) { ...
oo-style :
$username = $mysqli->escape_string($_POST['username']); $result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'"); if($result === FALSE) { yourErrorHandler($mysqli->error); // or $mysqli->error_list } else { // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach foreach( $result as $row ) { ...
с использованием подготовленного оператора:
$stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?'); if ( !$stmt ) { yourErrorHandler($mysqli->error); // or $mysqli->error_list } else if ( !$stmt->bind_param('s', $_POST['username']) ) { yourErrorHandler($stmt->error); // or $stmt->error_list } else if ( !$stmt->execute() ) { yourErrorHandler($stmt->error); // or $stmt->error_list } else { $result = $stmt->get_result(); // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach foreach( $result as $row ) { ...
Эти примеры только иллюстрируют , что должно быть сделано (обработка ошибок), а не как это сделать. При выпуске HTML код производства не должен использовать
or die
, иначе он будет (по крайней мере) генерировать недопустимый HTML. Кроме того, сообщения об ошибках базы данных не должны отображаться для пользователей, не являющихся администраторами, так как раскрывает слишком много информации .
Вы должны создать свои файлы шаблонов в правильном месте; в подкаталоге templates
рядом с вашим модулем python.
Ошибка указывает, что в каталоге templates/
нет файла home.html
. Убедитесь, что вы создали этот каталог в том же каталоге, что и ваш модуль python, и что вы действительно поместили файл home.html
в этот подкаталог. Если ваше приложение является пакетом, папка шаблонов должна быть создана внутри пакета.
myproject/
app.py
templates/
home.html
myproject/
mypackage/
__init__.py
templates/
home.html
Кроме того, если вы назвали папку шаблонов чем-то другим чем templates
и не хотите переименовывать его по умолчанию, вы можете указать Flask использовать этот другой каталог.
app = Flask(__name__, template_folder='template') # still relative to module
Я не знаю почему, но вместо этого мне пришлось использовать следующую структуру папок. Я поставил «шаблоны» на один уровень.
project/
app/
hello.py
static/
main.css
templates/
home.html
venv/
Это, вероятно, указывает на неправильную конфигурацию в другом месте, но я не мог понять, что это такое, и это сработало.
Вам нужно поместить все файлы .html
в папку шаблона рядом с вашим модулем python. И если в ваших html-файлах есть какие-либо изображения, вам нужно поместить все ваши файлы в папку с именем static
. В следующей структуре
project/
hello.py
static/
image.jpg
style.css
templates/
homepage.html
virtual/
filename.json