php/javascript изменить встроенную метку после обновления БД

это мой первый пост.. мой вопрос, наверное, очень простой, но я не могу найти правильный ответ..!

У меня есть php-страница с выбором запроса из базы данных, чтобы показать много записей, для каждой записи я поместил форму с некоторыми полями, которые необходимо обновить, и кнопку «Сохранить»

поэтому для каждой записи у меня есть столбец в таблице результатов, содержащий форму, например:

$code = "<td><form method='POST' action='mypage.php' target='_blank' />";

$code .= " <input type='hidden' name='function' value='formtaglieok' />";
$code .= " <input type='hidden' name='email' value='".$email."' />";
$code .= " <input type='hidden' name='main' value='".$main."' />";
..... some other editing fields
$code .= "<input type='text' name='field1' value='' size='2' />"
..... some other editing fields
$code .= "<td><input type='submit' value='Save' /></td>"

после этого столбца я поставил метку, которую хочу изменить после нажатия кнопки и обновления записи, например:

$code .= "<td><div id='<this_record_id>' ></div></td>";

в mypage.php у меня есть php-код для обновления записи:

function updaterecord($_POST){
  ...connection to db, prepare the query etc..
  $stid = OCIParse($conn, $query);        

  if (OCIExecute($stid)) {
      $res .= "Saved ";
  } else {
      $res .= "Error";      
  } 

  echo $res;     
}

очевидно, с таким действием формы и целью «_blank» я вижу на новой странице результат «Сохранено» или «Ошибка», и обновление записи в БД в порядке

Я бы не стал помещать «Сохранено» на новую страницу, а обновил div this_record_id рядом с кнопкой «Сохранить».

Итак, я попытаюсь добавить событие onClick к кнопке отправки.

<input type='submit' value='Save' onclick='jSaved(<this_record_id>)' />

и поместите этот код в шапку страницы

<script type='text/javascript'>
function jSaved(bcode){

    document.getElementById(bcode).innerHTML = 'Saved';
}
</script>

и он корректно обновляет метку, но открывает и другую страницу.

то, что я хотел бы сделать, это выполнить мою функцию обновления внутри кода JS, используя массив $_POST, поэтому не получайте новую страницу, а только результат функции в метке.

кто-нибудь может мне помочь?

изменить: РЕШЕНО

1) моя главная страница php с такой формой (ВАЖНО установить form_id):

$code = "<form name='frm_".$record['TD001_SEQ']."' id='frm_".$record['TD001_SEQ']."' action='' />";

$code .= " <input type='hidden' name='function'  id='function' value='formtaglieok' />";


$code .= " <input type='hidden' name='email'     id='email' value='".$email."' />";
$code .= " <input type='hidden' name='main'      id='main' value='".$main."' />";
$code .= " <input type='hidden' name='store'     id='store' value='".$store."' />";
$code .= " <input type='hidden' name='valuta'    id='valuta' value='".$valuta."' />";
....other fields
//the code for the button (not submit)
$code .= "<td><input type='button' value='Save' onclick='jSaved(".$record['TD001_SEQ']."); '/></td>";
//the label DIV with the same reference of the form/record updating
$code .= "<td><div id='res_".$record['TD001_SEQ']."' ></div></td>";

2) код javascript

  function jSaved(td001){

        //searching for exact form from the document page
        var form = false;
    var length = document.forms.length;
    for(var i = 0; i < length; i++) {
      if(document.forms[i].id == "frm_" + td001) {
        form = document.forms[i];
      }
    }

    //create a string containing all key/values from the form (parameters)      
        length = form.length;
        var sParams = "";

        for(var i = 0; i < length; i++) {
          //will be key1=val1&key2=val2 ....
          sParams = sParams + form.elements[i].id + "=" + form.elements[i].value + "&";

    }

    //execute the php update function with params in POST, td001 is needed to write le DIV label after update       

        var updResult = updateRecord("upd.php", sParams, td001);


  }

    //ajax code
  function updateRecord(strUrl, params, idDiv) {
    var xmlHttpReq = false;

    if (window.XMLHttpRequest) {
      xmlHttpReq = new XMLHttpRequest();
    }
      else if (window.ActiveXObject) {

      xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }


    xmlHttpReq.open('POST', strUrl, true);


    xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');


    xmlHttpReq.send(params);


    xmlHttpReq.onreadystatechange = function() {

        /*state evaluation
        * 0 - UNINITIALIZED
        * 1 - LOADING
        * 2 - LOADED
        * 3 - INTERACTIVE
        * 4 - COMPLETE*/

        //state complete
        if (xmlHttpReq.readyState == 4) {
                //updating the DIV label with upd.php result 
                document.getElementById('res_' + idDiv).innerHTML = xmlHttpReq.responseText;
        } 


    }

    return resUpd;
  }


</script>

3) страница upd.php

if (isset($_POST)) {      
  funFormTaglieOK($_POST);
} else {
  echo "Denied";
}

function funFormTaglieOK($params){
  global $dbdw_usr, $dbdw_pwd, $dbdw_SID;
    // Try to connect to Oracle
  if ($conn = OCILogon($dbdw_usr, $dbdw_pwd, $dbdw_SID)) {
   //execute record update
   if (recordupdate is ok){
    echo "Update"
   } else {
    echo "Error" 
   }

  }
}

person Andrea    schedule 19.08.2015    source источник


Ответы (1)


Итак, вы должны использовать ajax и не использовать target=_blank.

Если вам нужно новое окно, вы все равно можете открыть его с помощью Javascript.

В вашем PHP-коде, который вызывается вызовом ajax, вы должны возвращать правильные результаты в формате JSON. Вы должны проанализировать эту строку в JS и соответствующим образом обновить DOM.

person SalDev    schedule 19.08.2015
comment
Спасибо SalDev за ваш быстрый ответ, но, вероятно, я не правильно объяснил свою проблему, функция, как описано, на данный момент делает 2 вещи отдельно: 1 - это php, вызываемый действием в форме, и обновляйте запись, но покажите мне ответ в отдельном окне, 2 в событии onclick, которые показывают, что я сохранен там, где мне нужно. Я хочу запустить обновление записи из события onclick, которое покажет в элементе DIV правильный ответ (а не в отдельном окне), поэтому мне нужно знать, как использовать $_POST формы из кода JS, Благодарность.. - person Andrea; 19.08.2015
comment
да, удаляя целевой _blank, у меня нет новой страницы, но главная страница со всеми извлеченными записями теперь будет воссоздана, и это не то, что мне нужно. Главная страница со всем набором результатов должна быть всегда одной и той же, и нажатие кнопки одна кнопка «Обновить» для каждой записи, только метка DIV должна быть обновлена ​​с индикацией, сохраненной рядом с записью, поэтому функция onClick JS должна выполнять код php для обновления записи, без открытия новой страницы или воссоздания существующей, только получение результата операции и занесение его в этикетку, надеюсь понятно - person Andrea; 19.08.2015
comment
Да, именно поэтому я рекомендовал вам использовать ajax. Вы можете отправить один набор данных на запрос ajax и обновить точный DIV с результатом операции на стороне сервера. Вам не нужно перестраивать какую-либо часть DOM, просто обновите соответствующее значение innerHTML DIV с текстом результата. - person SalDev; 19.08.2015
comment
Спасибо, SalDev, моя проблема в том, что я старый программист и только сейчас читаю об AJAX.. но я нашел ссылку с примером, который помогает мне понять, что такое AJAX, и этот код мне помог: danieletabacco.com/un-semplice-esempio-di-ajax - person Andrea; 20.08.2015