Прога из учебника.
Есть некоторая база данных с данными бегунов (эта функция работает нормально), в которую можно добавить данные новых бегунов. Вот тут у меня и возникает ошибка. При нажатии на кнопку "сохранить" service.php возвращает
Notice: Undefined index: action in C:\xampp\htdocs\ch09\service.php on line 2 (при том, что изначально этой ошибки нет и массив данных из БД выводится корректно)
Notice: Undefined index: action in C:\xampp\htdocs\ch09\service.php on line 16 (в js (строка 77, внутри обработки клика по кнопке) задаётся значение атрибута action = "addRunner", как это и требуется в строке 16)
Не могу понять, в чём ошибка :(
<body>
<header>
<h2>2011 Race Finishers!</h2>
</header>
<div id="main">
<ul class="idTabs">
<li><a href="#all">Все финишировавшие</a></li>
<li><a href="#female">Женщины</a></li>
<li><a href="#male">Мужчины</a></li>
<li><a href="#new">Добавить нового участника</a></li>
</ul>
<div id="male">
<h4>Финишировавшие мужчины</h4>
<ul id="finishers_m"></ul>
</div>
<div id="female">
<h4>Финишировавшие женщины</h4>
<ul id="finishers_f"></ul>
</div>
<div id="all">
<h4>Все финишировавшие</h4>
<ul id="finishers_all"></ul>
</div>
<div id="new">
<h4>Добавить нового финишировавшиего</h4>
<form action="service.php" id="addRunner" name="addRunner" method="POST">
Имя: <input type="text" name="txtFirstName" id="txtFirstName"> <br>
Фамилия: <input type="text" name="txtLastName" id="txtLastName"> <br>
Пол: <select name="ddlGender" id="ddlGender">
<option value="">--Выберите пол--</option>
<option value="f">Женский</option>
<option value="m">Мужской</option>
</select><br>
Время:
<input type="text" name="txtMinutes" id="txtMinutes" size="10" maxlength="2"> (Минуты)
<input type="text" name="txtSeconds" id="txtSeconds" size="10" maxlength="2"> (Секунды)
<br><br>
<button type="submit" name="btnSave" id="btnSave">Сохранить</button>
<input type="hidden" name="action" value="addRunner" id="action">
</form>
</div>
</div>
<footer>
<h4>Поздравляем всех финишировавших!</h4>
<br>
<span id="freq"></span><br><br>
Последнее обновление: <div id="updatedTime"></div>
<button id="btnStart">Вернуть обновления</button>
<button id="btnStop">Прекратить обновления</button>
</footer>
<script src="scripts/jquery-1.6.2.min.js"></script>
<script src="scripts/my_scripts.js"></script>
<script src="scripts/jquery.idTabs.min.js"></script>
</body>
<?php
if ($_GET['action']=='getRunners'){
$query = "SELECT first_name, last_name, gender,finish_time FROM `runners` ORDER BY finish_time";
$result = db_connection($query);
$runners = array();
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
//print_r($row); вывод содержимого массива
array_push($runners,array("fname"=>$row["first_name"],
"lname"=>$row["last_name"],
"gender"=>$row["gender"],
"time"=>$row["finish_time"]));
}
echo json_encode(array("runners"=>$runners));
exit;
}elseif($_POST['action'] == 'addRunner'){
$fname = htmlspecialchars($_POST["txtFirstName"]);
$lname = htmlspecialchars($_POST["txtLastName"]);
$gender = htmlspecialchars($_POST["ddlGender"]);
$minutes = htmlspecialchars($_POST["txtMinutes"]);
$seconds = htmlspecialchars($_POST["txtSeconds"]);
if (preg_match('/[^\w\s]i',$fname) || preg_match('/[^\w\s]i',$lname)){
fail("Некорректное имя");
}
if (empty($fname)||empty($lname)){
fail("Пожалуйста, введите имя");
}
if (empty($gender)){
fail("Пожалуйста, укажите пол");
}
$time = $minutes.":".$seconds;
$query = "INSERT INTO runners SET first_name='$fname', last_name='$lname', gender='$gender', finish_time='$time'";
$result = db_connection($query);
if ($result){
$msg = "Бегун ".$fname." ".$lname." успешно добавлен!";
success($msg);
}else{
fail('Вставить бегуна не удалось');
}
exit;
}
function db_connection($query){
/*Подключение к бд: сервер, тия пользователя, пароль, название базы данных
В случае не подключения выдаст сообщение и прекратит работу*/
$link = mysqli_connect("127.0.0.1", "runner_db_user", "runner_db_password", "hfjq_race_info")
OR die("Нет подключения к БД");
return mysqli_query($link, $query);
}
function fail($message){
die(json_encode(array("status"=>"fail","message"=>$message)));
}
function success($message){
die(json_encode(array("status"=>"success","message"=>$message)));
}
?>
$(document).ready(function(){
var FREQ = 10000 ;
var repeat = true;
function showFrequency(){
$("#freq").html( "Страница обновляется каждые " + FREQ/1000 + " секунд.");
}
function startAJAXcalls(){
if(repeat){
setTimeout( function() {
getDBRacers();
startAJAXcalls();
},
FREQ
);
}
}
function getTimeAjax(){
var time = "";
$.ajax({
url: "time.php",
cache: false,
success: function(data){
$('#updatedTime').html(data);
}
});
}
$("#btnStop").click(function(){
repeat = false;
$("#freq").html( "Обновления прекращены." );
});
$("#btnStart").click(function(){
repeat = true;
startAJAXcalls();
showFrequency();
});
getDBRacers();
showFrequency();
startAJAXcalls();
$("#btnSave").click(function(){
var ser = $("#addRunner:input").serializeArray();
$.post($("#addRunner").attr("action"),ser, function(json){
if (json.status == "fail"){
alert(json.message);
}else if(json.status=="success"){
alert(json.message);
clearInputs();
}
}, "json");
});
function clearInputs(){
$("#addRunner:input").each(function(){
$(this).val(''); //задаём атрибуту value формы пустое значение
});
}
$("#addRunner").submit(function(){
return false;
}); //отменяет отправку формы по умолчанию, чтобы срабатывало по клику
function getDBRacers(){
$.getJSON("service.php?action=getRunners",function(json){
if (json.runners.length>0){
$('#finishers_m').empty();
$('#finishers_f').empty();
$('#finishers_all').empty();
$.each(json.runners, function() {
var info = '<li>Имя: ' + this["fname"] + ' ' + this["lname"] + '. Время: ' + this["time"] + '</li>';
if( this["gender"] == "m" ){
$('#finishers_m').append( info );
}else if ( this["gender"] == "f" ){
$('#finishers_f').append( info );
}else{ }
$('#finishers_all').append( info );
});
}
});
getTimeAjax();
}
});
Буду благодарна за помощь :(