#php #javascript #jquery #mysql #session-variables
#php #javascript #jquery #mysql — сервер #сессия-переменные #mysql
Вопрос:
Хорошо, я новичок во всем этом, так что это может показаться многословным подходом. Что я пытаюсь сделать, так это для одной кнопки, она просто добавляет переменную (которая является идентификатором) в сеанс. Это для временного списка, к которому пользователь может получить доступ, находясь на сайте. Я делаю это с помощью отправки POST. Эту конкретную кнопку я называю классной доской. Другая кнопка — избранное. Пользователь может щелкнуть и добавить идентификатор в свои избранные (сохраненные в базе данных), чтобы при возвращении и входе в систему избранные все еще были там. Опять же, для этого используется отправка POST. Мой подход мне кажется неустойчивым, и в последней версии Firefox (4.01) внезапно перестал работать. В идеале, у меня была бы кнопка, которая не отправляет (что приводит к перезагрузке страницы), но у которой была бы живая кнопка, которая меняется при нажатии, но делает все в фоновом режиме
/////Chalkboard///// (adding/removing to session)
<?php
if(isset($_POST['chalkboard_submit'])){
$_SESSION['chalkboard'][] = $_POST['cb'];
}
elseif(isset($_POST['chalkboard_remove'])){
$_SESSION['chalkboard'] = array_diff($_SESSION['chalkboard'], array($_POST['cb']));
}
/////Favorites///// (adding/removing to database)
if(isset($_POST['favorites_submit'])){
$fav_query = "SELECT favorites FROM users
WHERE id = {$_SESSION['id']}";
$fav_result = mysql_query($fav_query,$connection);
$row = mysql_fetch_array($fav_result);
if(empty($row['favorites'])){
$favorites = array();
$favorites[] = $_POST['fav'];
$_SESSION['favorites'] = $favorites;
$favorites = __serialize($favorites);
}elseif(!empty($row['favorites'])){
$favorites = __unserialize($row['favorites']);
if(!in_array(($_POST['fav']), $favorites)){
$favorites[] = $_POST['fav'];}
$_SESSION['favorites'] = $favorites;
$favorites = __serialize($favorites);
}
$fav_insert = "UPDATE users SET
favorites = '{$favorites}'
WHERE id = '{$_SESSION['id']}'
LIMIT 1
";
$fav_result = mysql_query($fav_insert,$connection);
}
elseif(isset($_POST['favorites_remove'])){
$fav_query = "SELECT favorites FROM users
WHERE id = {$_SESSION['id']}";
$fav_result = mysql_query($fav_query,$connection);
$fav_row = mysql_fetch_array($fav_result);
$favorites = __unserialize($fav_row['favorites']);
$favorites = array_diff($_SESSION['favorites'], array($_POST['fav']));
$_SESSION['favorites'] = $favorites;
$favorites = __serialize($favorites);
$fav_insert = "UPDATE users SET
favorites = '{$favorites}'
WHERE id = '{$_SESSION['id']}'
LIMIT 1
";
$fav_result = mysql_query($fav_insert,$connection);
}
?>
///////// FORM ///////////
<?php
$quote = "<a name="" . $quotes['id'] . ""></a>
<form action="favorites.php?subj=" . $_SESSION['subj'] . "#" . $quotes['id'] . "" method="post">
<a href="quote_details.php?id=" . $quotes['id'] . "">"" . $quotes['quote'] . ""</a>
<input type="hidden" value="" . $quotes['id'] . "" name="cb" />
<input type="hidden" value="" . $quotes['id'] . "" name="fav" />";
###################### CHALK-BOARD #################################
if(isset($_SESSION['chalkboard']) amp;amp; in_array($quotes['id'], $_SESSION['chalkboard'])){
$quote .= "<input type="image" src="images/chalk_board_add_active.gif" name="chalkboard_remove" value="submit" title="Remove from Chalk-board"/>";
}else{
$quote .= "<input type="image" src="images/chalkboard_add.gif" name="chalkboard_submit" value="submit" title="Add to Chalk-board"/>";
}
####################### FAVORITES ################################
if(isset($_SESSION['favorites']) amp;amp; in_array($quotes['id'], $_SESSION['favorites'])){
$quote .= "amp;nbsp;amp;nbsp;<input type="image" src="images/favorites_hover.gif" name="favorites_remove" value="submit" title="Remove from Favorites"/>";
}else{
$quote .= "amp;nbsp;amp;nbsp;<input type="image" src="images/favorites_add.gif" name="favorites_submit" value="submit" title="Add to Favorites"/>";
}
$quote .= "</form>";
?>
Комментарии:
1. попробуйте использовать кнопки отправки вместо кнопок изображения и посмотрите, изменится ли это
Ответ №1:
При использовании изображений в качестве кнопок отправки браузер обычно отправляет сообщение о том, где вы нажали на изображение, а не о том, было ли оно нажато. Браузер, вместо отправки chalkboard_submit=submit
, отправит chalkboard_submit_x=20
и chalkboard_submit_y=15
(эти цифры будут варьироваться в зависимости от того, где пользователь нажал на изображение).
Некоторые браузеры могут отправлять только chalkboard_submit=submit
, а другие отправят все три. Чтобы исправить это и сохранить совместимость с большинством браузеров, вам нужно проверить оба способа. Изменить:
if(isset($_POST['chalkboard_submit'])){
$_SESSION['chalkboard'][] = $_POST['cb'];
}
elseif(isset($_POST['chalkboard_remove'])){
$_SESSION['chalkboard'] = array_diff($_SESSION['chalkboard'], array($_POST['cb']));
}
if(isset($_POST['favorites_submit'])){
elseif(isset($_POST['favorites_remove'])){
Для:
if(isset($_POST['chalkboard_submit']) || isset($_POST['chalkboard_submit_x'])){
$_SESSION['chalkboard'][] = $_POST['cb'];
}
elseif(isset($_POST['chalkboard_remove']) || isset($_POST['chalkboard_remove_x'])){
$_SESSION['chalkboard'] = array_diff($_SESSION['chalkboard'], array($_POST['cb']));
}
if(isset($_POST['favorites_submit']) || isset($_POST['favorites_submit_x'])){
elseif(isset($_POST['favorites_remove']) || isset($_POST['favorites_remove_x'])){
и это должно сработать.
Вам не нужно проверять, установлены ли оба _x'
и _y'
, потому что, если одно, другое тоже должно быть.