|
|
|
| Всем привет! Кратко обрисую ситуацию:
Есть файл "index.html" в нем js код:
$(document).ready(function() {
$("#otvet").load("table.php");
$('#otvet').change(function() {
$.ajax({
type: "POST",
url: "change_func.php",
data: "cod=123",
dataType: "html",
cache: false,
success: function(data) {
$('#echo_change_text').html(data);
}
});
});
});
});
|
В файле "table.php" циклом формируется таблица(около 20 строк), а в файле "change_func.php" скрипт обработчик, который работает с полученным значением "cod=123" (на самом деле значение может быть разным, просто упростил для примера).
Проблема в том что на странице index.html выводится только первая строка таблицы, а в контейнер #echo_change_text выводится код файла change_func.php в том виде в котором он есть(как текстовый документ), то есть в блоке echo_change_text я вижу "<?php echo $text;?>" вместо того чтобы увидеть "123". Я так понимаю что php обрабатывает данные и выводит результат в виде текста, тогда почему на странице index.html он выводит содержимое php файла в виде исходного текста? | |
|
|
|
|
|
|
|
для: sasha12342
(21.04.2016 в 12:04)
| | а php умеет обрабатывать html как php? его кто то этому научил?
код
выводит 123? | |
|
|
|
|
|
|
|
для: indexer
(21.04.2016 в 12:47)
| | Сам файл php работает как надо. Он получает значение методом POST обрабатывает ее и выдает результат(это в том случае если мы открываем в браузере файл "change_func.php"). А если мы получаем данные из файла "change_func.php" ajax-ом и выводим их на странице "index.html" то выводится весь код файла "change_func.php" такой как он есть(не в виде результата отработавшего скрипта, а в виде исходного кода самого файла "change_func.php"). Получается что файл "change_func.php" не отрабатывает свой скрипт, а тупо отправляется в оригинальном виде клиенту. | |
|
|
|
|
|
|
|
для: sasha12342
(21.04.2016 в 13:07)
| | Заканчивать работу скрипта надо после ответа на асинхронный запрос, то есть не echo ...., а exit(....) | |
|
|
|
|
|
|
|
для: confirm
(21.04.2016 в 13:41)
| | Раньше показывал:
Сейчас показывает:
Причем он показывает не весь документ, а лишь часть его, вторую половину кода документа, начиная с в документе это строка выглядит так:
foreach($array_post as $k1=>$k2) {
| Так вот, до "$k2)" все пусто(около 30% файла) а после него выводит так как в исходном файле, с тегами переменными, условиями... Раньше я искал решения как вывести исходный код на экран, а сейчас не могу от него избавится ))) | |
|
|
|
|
|
|
|
для: sasha12342
(21.04.2016 в 14:48)
| | Видимо знак ">" ajax считает как окончание тега, и то что до него не выводит, но ведь это php документ, почему он читается как текстовый? Ведь когда ajax к нему обращается, он должен сработать на сервере и вернуть ответ в виде текста, о не отдавать свой исходный код. | |
|
|
|
|
|
|
|
для: sasha12342
(21.04.2016 в 14:48)
| | Вы бы вместо рассуждений показали серверную часть кода, а не клиентский ajax запрос, который нафик не нужен, ибо проблема на сервере. Коли вы все ссылаетесь на что-то, что выводится полностью, а надо полагать должна быть часть, то причина этого только одна - не завершается работа скрипта после ответа на запрос клиента, а значит сервер будет отдавать все, что ниже кода ответа на запрос. Это понятно?
Показывайте свой РНР код, или гадайте сами. | |
|
|
|
|
|
|
|
для: confirm
(21.04.2016 в 15:59)
| | Не вопрос:
<?php
$table_tr1_massiv = array('Удаление (сбивка, зачистка старого покрытия)',
'Устройство цементной стяжки толщ.до 50мм', 'Устройство цем.стяжки с армирующей сеткой',
'Гидроизоляция гидроизолирующими смесями', 'Демонтаж старой сантехники',
'Установка ванны', 'Установка душевой кабины', 'Установка унитаза');
$table_tr2_massiv = array(' м<sup>2</sup>', ' м<sup>2</sup>', ' м<sup>2</sup>', ' м<sup>2</sup>',
' шт.', ' компл', ' компл', ' компл');
$table_tr3_massiv = array('100', '300', '350', '140', '110', '320', '750', '240');
$reg1="/[^0-9]/";
$reg2="/\.+/";
$rezult="";
$array_post=$_POST['post_z'];
$array_post = substr($array_post, 0, -1);
$array_post=str_replace(",","",$array_post);
$array_post = explode("&",$array_post);
foreach($array_post as $k1=>$k2) {
$k2 = explode("=",$k2);
$rezult=$rezult+preg_replace($reg2,'.', preg_replace($reg1, '.', trim($k2[1])))*$table_tr3_massiv[$k1];
}
$count = substr_count( $rezult, "," );
if($count==1){
$rezult=round($rezult, 4);
$rezult=substr($rezult, 0, strpos($rezult, ",")+3);
}
if($rezult>0){
$rezult_colcul = "<p align='center'><b>Итого: <font color='green'>$rezult</font> рублей</b></p><a href='?'>Сбросить</a>";
}else{
$rezult_colcul = "<p align='center'><b>Итого: <font color='green'>$rezult</font> рублей</b></p><a href='?'>Сбросить</a>";}
if($rezult_colcul=="")
{$rezult_colcul = "<p align='center'><b>Итого: <font color='green'>$rezult</font> рублей</b></p><a href='?'>Сбросить</a>";}
echo $rezult_colcul;
?>
| Зачем ругаться... )) | |
|
|
|
|
|
|
|
для: sasha12342
(21.04.2016 в 16:16)
| | Вы уверены что вот эта часть кода
<?php $array_post = explode("&",$array_post);
|
отрабатывает ожидаемо?
что прилетает в $_POST['post_z'] ? запишите вывод переменной в файл и посмотрите, что там в действительности приходит.
как то не очень хорошо отправлять post упакованным в стиль get, а потом делать explode по "&"
$array_post была переменной, а потом вдруг стала массивом.
и содержимое $array_post на каждом шагу запишите в фай после выполнения запроса ajax
ну и header('Content-type: text/html'); думаю не повредит | |
|
|
|
|
|
|
|
для: sasha12342
(21.04.2016 в 16:16)
| | Вы понимаете что такое логика?
Во - первых коли уж хотите чтобы этот код связали с клиентским запросом, то будьте добры показывать данные клиента.
Во-вторых, если клиентом определен метод передачи POST, то data: "v1=1&v2=2&v3=3", и будет как массив в $_POST, если же охота под одним ключом данные, то на клиенте должно быть data: "post_z[]=1&post_z[]=2&post_z[]=3".
В третьих - вы описываете проблему как передачу лишних данных, и почему она может происходить я писал. Вопрос - разве из вашего куска код можно понять общую логику работы его, то есть самого диалога клиент->сервер?
В четвертых - и что, это все данные и вечные? Может все-таки СУБД? | |
|
|
|
|
|
|
|
для: confirm
(21.04.2016 в 18:24)
| | В переменную $array_post прилетает:
pol0=05&,pol1=0&,pol2=0&,pol3=0&,pol4=0&,pol5=0&,pol6=0&,pol7=0&
|
header добавил(результат такой-же).
Данные клиента:
$count = count($table_tr1_massiv);
for ($i=0; $i<$count; $i++)
{
echo "
<tr class='tab_tr'>
<td class='tab_td1'>$table_tr1_massiv[$i]</td>
<td class='tab_td2'><input class='input_change' type='text' size='2' value='0'>$table_tr2_massiv[$i]</td>
<td class='tab_td5'>$table_tr3_massiv[$i]</td>
</tr>";
}
| подключаются к html файлу:
$("#otvet").load("table.php");
| js код который посылает данные из формы:
$('#otvet').change(function() {
$('.len').each(function(){
var input = this.elements, i = input.length, array = [];
while(i--){
str_1=$(input[i]).val();
array.push("pol"+i+"="+str_1.replace(/[&]+/g,'.')+"&");
}
$.ajax({
type: "POST",
url: "change_func.php",
data: {post_z: array.reverse().join()},
dataType: "html",
cache: false,
success: function(data) {
$('#echo_change_text').html(data);
}
});
});
});
| срабатывает все по:
$(document).ready(function() {
| вроде все разложил. на данном этапе работаю с постоянными переменными, в дальнейшем конечно-же все будет вытаскиваться из БД. Если я все тоже самое проделываю в индексном файле с расширением .php то все работает нормально, с расширением .html не хочет. это класс формы в которую подгружается таблица. | |
|
|
|
|
|
|
|
для: sasha12342
(22.04.2016 в 00:10)
| | Что в логах сервера? если не выполняется php код из за ошибки и не видно ошибки в браузере, то об этом стоит почитать в логах. Поднимите уровень отображения ошибок выше. и почитайте не только ошибки php, а и самого сервера обычно они в разных файлах.
в php.ini или настройках хоста, что прописано в директиве security.limit_extensions? и прописано ли там что то?
спрошу еще раз, кто и как учил php обрабатывать html как php? другими словами кто хостер?
nginx+php-fpm попробовал повторить/проверить код - полет нормальный, да и ошибок в коде я не заметил. Код экзотичный/упрощенный, но рабочий
ajax выполняется в браузере клиента и только там, если выводится исходный код (часть исходного кода) php - это говорит о том, что php не умеет обрабатывать код php внутри html, либо он не знает расширение файла которое его пытаются заставить обработать.
Интерпретатор php в умолчательных настройках срабатывает только на расширение .php все остальные расширения пролетают мимо интерпретатора php как text/html если не будет указано другое в php.ini
из всего вышесказанного:
Если прилетает исходный код php то это означает, что сервер не может его обработать как php и отправляет его как текст. | |
|
|
|
|
|
|
|
для: sasha12342
(22.04.2016 в 00:10)
| | В вашем коде столько лишнего и глупостей....
1) Строка pol0=05&,pol1=0&,pol2=0&,pol3=0&,pol4=0&,pol5=0&,pol6=0&,pol7=0 не может являться валидной url строкой, не могут быть никаких с какого потолка взято, что параметры разделятся так - &,? Амперсанд считается разделителем, и правильно вот так - pol0=05&pol1=0&pol2=0&pol3=0&pol4=0&pol5=0&pol6=0&pol7=0.
2) Даже если одевать штаны через голову, как вы пытаетесь, то заниматься на сервере вот этим:
$array_post=str_replace(",","",$array_post); - в случае валидной строки вообще не требуется,
а
это
<?
$array_post = explode("&",$array_post);
foreach($array_post as $k1=>$k2) {
$k2 = explode("=",$k2);
$rezult=$rezult+preg_replace($reg2,'.', preg_replace($reg1, '.', trim($k2[1])))*$table_tr3_massiv[$k1];
}
|
полная чушь, ибо есть parse_str()
<?
parse_str($array_post, $array_post);
|
3) Заниматься этим на клиенте тоже не понятно для чего
$('.len').each(function(){
var input = this.elements, i = input.length, array = [];
while(i--){
str_1=$(input[i]).val();
array.push("pol"+i+"="+str_1.replace(/[&]+/g,'.')+"&");
}
|
все это в помойку и в параметрах запроса
data: $(this).serialise(), //можно serialiseArray()
|
и все ваши pol... будут как ключи в массиве $_POST.
В общем код конечно кошмарный. Но вы не понимаете что есть диалог клиент->сервер. Еще раз напомню, что жалобы были о возврате клиенту лишнего. А причина этого в том, что серверу не сказали "верни от этого до этого и дальше спать".
Допустим пользователь открывает индексный файл - страница открывается, все ОК. Жмет на ней кнопку "Скачать файл" (не важно что это не Ajax, суть та же), при этом обращение опять таки к индексному файлу, но страница при этом не перегружается, и кроме выдачи диалога файла на скачивание пользователь ничего не получит. А работает то все просто:
<?php
if($_GET['download']) {
//код выдачи файла
//после чего обязательно закончить работу скрипта
exit;
//если этого не сделать, то в браузер клиента будет вывод нижеследующего
}
<html>
<head>
......
?>
|
То есть, при просто запросе страницы без указанного параметра, открывается страница. Если пришел параметр запроса на скачивание, то обрабатывается только этот запрос. Причем обработка этого запроса должна размещаться до любого вывода в браузер.
То же самое и с асинхронными запросами - если файл к которому обращается запрос обрабатывает только его, других подключений с выводом в браузер в нем нет, то просто echo .... Но если кроме обрабатываемого параметра есть вывод в браузер, который не подпадает под условие параметра, то ответ клиента предполагает и выход - exit(данные клиенту).
Все, другой причины быть не может, клиент получает ровно то, что выполняет и отдает сервер. Разберитесь со структурой кода, а именно с самим диалогом - запрос->обработка->ответ (с выходом если требуется).
Что касается передачи заголовка - у вас в параметрах запроса указан тип ожидаемых данных - "html", поэтому заголовок, что передан html, клиенту уже не требуется. | |
|
|
|
|
|
|
|
для: confirm
(22.04.2016 в 10:13)
| | =) хм... слова не лишены логики и в случае с загрузкой понятно, но почему отдается php код в браузер? Даже если скрипт продолжает работать он может вывалить мусор или ошибки. как он отдает собственный код?
Честно говоря, я не сталкивался с таким поведением, когда при ошибке в коде/логике вываливается весь код php в браузер и не знал, что делать в таком случае. У меня была бы паника, что при хитро составленном запросе можно весь сервер через эту "дырочку" поиметь.
for ts:
exit() конечно важен Но как говорится "не лепи куда попало" и "чем крепче сожмешь, тем сильнее рванет".
Код должен быть кодом, красивым кодом, код надо любить. Это не только к php относится.
а простите не "Бууэ-э-э-э,,, о0, да тут еще и марковка есть, а от куда она тут"?
p/s извините если мое высказывание несколько резко, я не хочу никого обижать этим. | |
|
|
|
|
|
|
|
для: indexer
(22.04.2016 в 11:08)
| | Не лепи куда попало... Не пороли бы хрени, глядишь и паники бы не было, а было понимание, что не важно что, главное вывод, а ошибки нужно обрабатывать, и уж коли отдавать их клиенту, то не те, что показывает парсер, а то, что можно показать.
Это не резкое высказывание, а глупое. | |
|
|
|
|
|
|
|
для: confirm
(22.04.2016 в 11:47)
| | от куда столько ненависти? Не все родились со знанием кода, но все когда то умрут. Поэтому какая разница? все же кругом условно-согластно-стандартно. | |
|
|
|
|
|
|
|
для: indexer
(22.04.2016 в 12:02)
| | А кто сказал что это ненависть?
Каков коммент, таков и ответ, а он глуп до костей мозгов, просто вы написали всякой херни, лишь бы языком ляпнуть. Я бы вообще прошел мимо так как в вашем комменте ничего полезного ни для кого нет, если бы не снисхождение ко мне - простить за резкость..., но как бы она позволительна вам, как же, дока... И смех и грех. Есть что сказать по делу - говорите, нет - не путайтесь под ногами. | |
|
|
|
|
2.8 Кб |
|
|
для: confirm
(22.04.2016 в 12:11)
| | Ладно, делаю следующим образом:
Имеем в корне следующие файлы:
obrabotchic.php - файл обработчик (его содержимое выложено выше);
index.php
<?php
header('Content-Type: text/html; charset=utf-8');
setlocale(LC_ALL, 'ru_RU.65001', 'rus_RUS.65001', 'Russian_Russia. 65001', 'russian');
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Style-Type" content="text/css">
<meta name="keywords" content="">
<meta name="description" content="">
<script type="text/javascript" src="js/jquery-1.8.2.min.js"></script>
<script type="text/javascript" language="javascript">
$(document).ready(function() {
$('.table_calc').change(function() {
$('.len').each(function(){
var input = this.elements, i = input.length, array = [];
while(i--){
str_1=$(input[i]).val();
array.push("pol"+i+"="+str_1.replace(/[&]+/g,'.'));
}
$.ajax({
type: "POST",
url: "obrabotchic.php",
data: {post_z: array.reverse().join()},
dataType: "html",
cache: false,
success: function(data) {
$('#echo_change_text').html(data);
}
});
});
});
});
</script>
</head>
<body>
<div style='border: 1px solid green; overflow:auto;'>
<div id='echo_change_text'>
<p align='center'><b>Итого: <font color='green'>0</font> рублей</b></p>
</div>
</div>
<form action="" method="POST" id='len' class='len'>
<table class='table_calc' cellspacing="1" id='otvet'>
<tr class='tab_tr'>
<td class='tab_td1'>$table_tr1</td>
<td class='tab_td2'><input class='input_change' name='pol' type='text' size='2' value='0'>$table_tr2</td>
<td class='tab_td5'>$table_tr3</td>
</tr>
<tr class='tab_tr'>
<td class='tab_td1'>$table_tr1</td>
<td class='tab_td2'><input class='input_change' name='pol' type='text' size='2' value='0'>$table_tr2</td>
<td class='tab_td5'>$table_tr3</td>
</tr>
<tr class='tab_tr'>
<td class='tab_td1'>$table_tr1</td>
<td class='tab_td2'><input class='input_change' name='pol' type='text' size='2' value='0'>$table_tr2</td>
<td class='tab_td5'>$table_tr3</td>
</tr>
<tr class='tab_tr'>
<td class='tab_td1'>$table_tr1</td>
<td class='tab_td2'><input class='input_change' name='pol' type='text' size='2' value='0'>$table_tr2</td>
<td class='tab_td5'>$table_tr3</td>
</tr>
</table>
</form>
</body>
</html>
|
index.html - код аналогичен, за исключением <?php header...
biblioteka.js - библиотека Jquery
Когда я меняю значения полей в файле index.php то результат возвращается ожидаемый(скрипт в обработчике php срабатывает нормально).
Когда я делаю тоже самое в файле index.html, то в ответ получаю исходный код php обработчика.
Если я на первую строку php обработчика(obrabotchic.php) ставлю то ajax возвращает в html файл исходный код обработчика(вместе с exit("stop");) а файл index.php показывает в блоке вывода ответа надпись: "stop".
Файл обработчик один, но ведет себя по разному, в зависимости от того с какого файла приходит запрос, а запрос одинаков с обеих файлах. Как так может быть?
Файлы прикрепил. | |
|
|
|
|
|
|
|
для: sasha12342
(22.04.2016 в 23:31)
| | А вы можете пояснить зачем вам коллекция индексных файлов?
index.* - это индексный файл по умолчанию, который прописан в конфигурации сервера, и если у вас .php, то кем-то набранный .html будет все таки перенаправлен на .php. Если на сервере бардак, что вряд ли, то для решения такой проблемы есть .htaccess.
Трудно представить, чтобы у сайта с динамическим содержанием индексный файл был чисто html, а из php только какой-то заголовок, который в общем то в данном случае и не нужен.
Но чтобы наконец-то вы поняли логику работы асинхронного обмена клиент->сервер показываю простые примеры, хотя данное по своей логике ни чем не отличается от примера "Скачать файл".
В первом случае пусть это будет чистый html, который отдает форму и содержит сценарий клиента, а обработка асинхронного запроса, это отдельный файл.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
$(function() {
var frm = $('#myform').submit(function(e) {
e.preventDefault();
$.post('send.php', frm.serialize(), function(d) {
if(!!d) $('#response').html(d)
})
})
});
</script>
</head>
<body>
<p>Server response</p>
<pre id="response"></pre>
<form id="myform">
<input name="fld1" value="5" />
<input name="fld2" value="12" />
<input name="fld3" value="55" />
<button>Send</button>
</form>
</body>
</html>
|
Примечание - serialize(), а не var input = this.elements, i = input.length, array = []; while(i--)... и прочая хрень в данном случае совсем не нужная. Метод асинхронного запроса взят упрощенный, собственно и вы используете $.ajax не понятно с какой целью. Но в данном случае не важен метод. О всех ajax-методах JQ читать тут.
Файл обработчик send.php простой - он просто возвращает содержимое $_POST.
Запустите, проверьте - все работает и лишнего не возвращает?
А теперь изменим структуру кода - запрос клиента будет к текущей странице, то есть html, которая содержит и форму, и клиентский сценарий. Файл обработчик будет подключаться по условию запроса клиента, и в данном случае php-код размещен в самом начале файла, а после окончания работы файла обработчика находится инструкция выхода, которая по умолчанию ремирована. Адрес асинхронного запроса изменяем на location, поэтому исполняя пример можете давать файлу .html любое имя:
<?php
if($_POST) {
include 'send.php';
//exit;
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
$(function() {
var frm = $('#myform').submit(function(e) {
e.preventDefault();
$.post(location, frm.serialize(), function(d) {
if(!!d) $('#response').html(d)
})
})
});
</script>
</head>
<body>
<p>Server response</p>
<pre id="response"></pre>
<form id="myform">
<input name="fld1" value="5" />
<input name="fld2" value="12" />
<input name="fld3" value="55" />
<button>Send</button>
</form>
</body>
</html>
|
Выполните теперь - вместе с содержимым $_POST сервер возвращает и код страницы. Уберите ремирование у exit. А теперь все работает как положено.
Вот и вся соль. Если же и данный пример будет не выполняться, и сервер возвращает не просто и то, и другое, а код страницы как есть, включая и строки php-кода, то причина этого банальна - не разрешено выполнение php-кода в файлах html (по умолчанию, это не исполняемый файл). Эта проблема также решается через .htaccess, добавьте в него строки:
RemoveHandler .html .htm
AddType application/x-httpd-php .php .htm .html .phtml
|
PS. К чему у вас biblioteka.js не понятно, хотя я не смотрел код во вложении, может там подключение. Но не надо и этим заниматься - библиотеку jQuery лучше подключать с ресурсов Google, в этом случае большая вероятность того, что у клиента она уже есть в кеше и закачивать ее опять не потребуется. | |
|
|
|
|
|
|
|
для: confirm
(24.04.2016 в 06:20)
| | Спасибо за примеры, но они у меня не работают. Двух индексных файлов я нигде не использую. Здесь-же я привел их в пример потому что мне кажется странным, что один файл обработчик, получает один и тот-же запрос(строка которую отдают индексные файлы) ведет себя по разному в зависимости от того с какого файла прилетает этот запрос.
Что касается примеров выше, то в первом случае ничего не происходит после нажатия(если по умолчанию ставлю запись в #response, то после отправки текст просто исчезает). Во втором случае просто игнорируется php код. После добавления записей в файл .htaccess ничего не изменилось. | |
|
|
|
|
|
|
|
для: sasha12342
(24.04.2016 в 23:13)
| | На чем вы тестируете скрипты? | |
|
|
|
|
|
|
|
для: confirm
(25.04.2016 в 06:08)
| | Денвер, версия: Денвер-3 2010-11-07 | |
|
|
|
|
|
|
|
для: sasha12342
(25.04.2016 в 15:01)
| | Сюда, а Денвер выбросить, умер он уже давно. | |
|
|
|
|