Автосохранение с php на mysql без изменения страницы или кнопки отправки

По сути, у меня есть список данных, которые отображаются с помощью оператора foreach из таблицы в моей базе данных. Мне нужен раскрывающийся список рядом с каждым, в котором есть некоторые значения, которые необходимо сохранить в поле в моей таблице, однако я хочу автоматически сохранять значение в раскрывающемся списке в поле, как только значение в нем будет изменено. Может ли кто-нибудь указать мне учебник или что-то, что может помочь?

Я использую php и mysql для создания системы, но при необходимости буду использовать JavaScript.

Я просмотрел это: динамическое автосохранение дискаhttp://www.dynamicdrive.com/dynamicindex16/autosaveform.htm, что похоже на то, что я хочу, однако я нужно, чтобы эти данные действительно хранились в моей базе данных, а не во временном хранилище.

Любое руководство ценится,

Ян


БОЛЬШОЕ ИЗМЕНЕНИЕ

Итак, спасибо за ответы, но я понятия не имею о вызове ajax..... Я нашел это: Как автоматически сохранить выделение в ComboBox в MYSQL в PHP без кнопки отправки?.

могу ли я заставить его работать?

<script>
$(document).ready(function(){
$('select').live('change',function () {
        var statusVal = $(this).val();
        alert(statusVal);
        $.ajax({
                 type: "POST",
                 url: "saveStatus.php",
                 data: {statusType : statusVal },
                 success: function(msg) {
                     $('#autosavenotify').text(msg);
                 }
      })
  });
});
</script>


<?php foreach ( $results['jobs'] as $job ) { ?>

          <td width="25%"><?php echo $job->job_id</td> 
          <td>
          <select name="status" id="status">
                  <option value=''>--Select--</option>
                  <option value='0'>Approve</option>
                  <option value='1'>Reject</option>
                  <option value='2'>Pending</option>
          </select>
          <div id="autosavenotify"></div>
          </td>
        </tr>
    <?php } ?>

и на странице saveStatus.php:

<?php
if (isset($_POST['statusType'])) {

$con=mysql_connect("localhost","username","mypass","rocketdb3");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("jobs", $con);

$st=$_POST['statusType'];
    $query = "UPDATE jobs SET status=$st WHERE job_id=$id";
    $resource = mysql_query($query) 
        or die (mysql_error());

}
?>

person snookian    schedule 09.08.2013    source источник
comment
Я использую X-editable vitalets.github.io/x-editable   -  person JimL    schedule 09.08.2013
comment
Просто сделайте AJAX-вызов PHP. Вероятно, это наиболее часто используемая технология в Интернете.   -  person Your Common Sense    schedule 09.08.2013
comment
Вы можете просто использовать функции PHP serialize для хранения значений элементов формы в БД.   -  person cerd    schedule 09.08.2013
comment
обратитесь по этой ссылке stackoverflow.com/questions/6108495/   -  person Ilesh Patel    schedule 09.08.2013


Ответы (4)


Где находится $id в saveStatus.php?

Вам нужно передать statusType и job_id через AJAX для правильного обновления в saveStatus.php.

Например:

<script>
$(document).ready(function(){
$('select').on('change',function () {
        var statusVal = $(this).val();
        var job_id = $(this).id;
        alert(statusVal);
        $.ajax({
                 type: "POST",
                 url: "saveStatus.php",
                 data: {statusType : statusVal, job_id: job_id },
                 success: function(msg) {
                     $('#autosavenotify').text(msg);
                 }
      })
  });
});
</script>


<?php foreach ( $results['jobs'] as $job ) { ?>

      <td width="25%"><?php echo $job->job_id; ?></td> 
      <td>
      <select name="status" id="<?php echo $job->job_id; ?>">
              <option value=''>--Select--</option>
              <option value='0'>Approve</option>
              <option value='1'>Reject</option>
              <option value='2'>Pending</option>
      </select>
      <div id="autosavenotify"></div>
      </td>
    </tr>
<?php } ?>

*Примечание: .live() устарело, используйте вместо него .on().

И saveStatus.php

$st = (int)$_POST['statusType'];
$id = (int)$_POST['job_id'];
$query = "UPDATE jobs SET status=$st WHERE job_id=$id";
person mrami0    schedule 09.08.2013
comment
Привет, извините, я частично удалил бит job_id, просто чтобы попытаться заставить что-то работать, проблема кажется в том, что когда я меняю раскрывающееся значение, ничего не происходит, как будто оно не идет по указанному URL-адресу, я изменил его с live на as ты сказал, но ничего. - person snookian; 09.08.2013
comment
@kaperu: У меня сработало, хотя я пока только помещал значение в сеанс, оно все еще отлично отправлялось. Спасибо! - person cfox; 22.11.2013

Для этого вам нужно будет использовать JavaScript (+ jQuery для облегчения работы). Перехватите «изменение» значения с помощью JavaScript и вызовите AJAX-вызов PHP-скрипта, который сохранит значение в базе данных MySQL.

person Borniet    schedule 09.08.2013

Используйте jQuery! В раскрывающемся событии onchange выполните вызов ajax и обновите запись в БД. Вот ссылка на метод jQuery Ajax.

person Deepak Biswal    schedule 09.08.2013
comment
Немного безрассудно говорить новичку в использовании Ajax просто помещать необработанный пользовательский ввод прямо в свою базу данных без надлежащей очистки, не так ли? - person cerd; 09.08.2013
comment
На первый взгляд, я подумал, что точка зрения @cerd была спорной. Однако всегда существует вероятность того, что при работе с HTML/JavaScript пользователь может манипулировать содержимым раскрывающегося списка перед его отправкой и отправить что-то вредоносное в базу данных. - Что-то, о чем следует помнить... - person chris.nesbit1; 09.08.2013
comment
Система используется только в небольшой компании из 3/4 человек, большинство из которых являются MD, поэтому отправка вредоносных данных не должна быть проблемой. Возможно, не имея понятия об AJAX :) - person snookian; 09.08.2013
comment
Вы можете обрабатывать данные по мере продвижения. Поскольку вы находитесь в начальной точке, сначала попробуйте интегрировать вызов ajax, а затем вы можете изменить любой способ сохранения данных в базе данных! - person Deepak Biswal; 09.08.2013

Вы можете использовать прослушиватель JavaScript onchange для элемента select примерно так

<select onchange="savedata()">

Функция savedata() - это не что иное, как ваш код AJAX. Я нашел сценарий AJAX, который берет содержимое из текстовых полей и сохраняет его в базе данных, которую вы можете изменить в соответствии с вашими потребностями.

function getData(){


var fd = new FormData();

  var title = document.getElementsByName('title')[0].value;
  var content = document.getElementsByName('content')[0].value;
  var id = document.getElementsByName('id')[0].value;
  fd.append('title',title);
  fd.append('content',content);
  fd.append('id',id);

  return fd;
}

function savePost(){
  try{
    var xhttp = new XMLHttpRequest();
  }
  catch(e){
    console.log(e);
  }
  var data = getData();
  xhttp.open('POST','autosave.php?save=true');
  xhttp.send(data);
  xhttp.onreadystatechange = function(){
    if(this.status == 200 && this.readyState == 4){
      if(data.get('id') == ""){
        document.getElementsByName('id')[0].value = this.responseText;
      }
      else{
        document.getElementById('message').innerHTML = this.responseText;
      }
      console.log(this.responseText);
    }
  }
}

setInterval(savePost,10000); //savePost will be called in every 10 seconds

PHP-скрипт для вставки и обновления базы данных выглядит следующим образом.

date_default_timezone_set('Asia/Kolkata'); //you can add your own timezone
$host = 'localhost';
$user = 'your_db_username';
$pass = 'your_db_password';
$db = 'autosave';
$conn = new mysqli($host, $user, $pass, $db);
function insertPost($title,$content, $conn){
  $sql = "INSERT INTO post VALUES(null, ?, ?)";
  $stmt = $conn->stmt_init();
  if($stmt->prepare($sql)){
    $stmt->bind_param('ss',$title,$content);
    if($stmt->execute()){
      echo $conn->insert_id;
    }
  }}

function updatePost($title,$content,$id, $conn){
  $sql = "UPDATE post SET title = ?, content = ? WHERE id = ?";
  $stmt = $conn->stmt_init();
  if($stmt->prepare($sql)){
    $stmt->bind_param('ssi',$title,$content,$id);
    if($stmt->execute()){
      echo "<i>Draft Saved at ".date("h:i:s a")."</i>";
    }
  }}
if(isset($_GET['save'])){
  $title = $_POST['title'];
  $content = $_POST['content'];
  $id = $_POST['id'];
  if($id != ''){
    updatePost($title, $content,$id, $conn);
  }
  else{
    insertPost($title, $content, $conn);
  }}
?>

Вы можете найти код и полное руководство по следующей ссылке: Система автосохранения данных с использованием PHP, MySQL и AJAX

person Mohd Shibli    schedule 07.07.2018