это мой первый пост .. мой вопрос, вероятно, очень прост, но я не могу найти правильный путь ..!
У меня есть страница 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"}
}
}
Итак, вы должны использовать ajax и не использовать target = _blank.
Если вы хотите новое окно, вы все равно можете открыть его с помощью Javascript.
В вашем PHP-коде, который вызывается с помощью вызова ajax, вы должны возвращать правильные результаты в формате JSON. Вы должны проанализировать эту строку в JS и соответственно обновить DOM.
Других решений пока нет …