Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Передача массива из Php в Javascript (https://javascript.ru/forum/server/11900-peredacha-massiva-iz-php-v-javascript.html)

kamushek 20.09.2010 14:00

Передача массива из Php в Javascript
 
Как лучше удобней передать массив php в javascript? Без Ajax и cookie.

micscr 20.09.2010 16:46

Сложно что ли на php сформировать для js массив вида: [2,3,4] ?

Gozar 20.09.2010 17:31

echo '<script>var a = ['.implode(",",$arr).']</script>';

DooMer 22.09.2010 14:59

json_encode

kamushek 22.09.2010 19:10

Всем спасибо!
У меня получилось вот так
var Voprosi=[<?php 	foreach ($Voprosi as $value)// переводит массивы из php в javascript
echo  '"'.$value.'",';	 ?>];

DooMer 23.09.2010 10:30

kamushek,
за такой код вам добавят кармы на говнокод.ру =)

micscr 24.09.2010 11:43

плюс из-за запятой в конце списка эл-тов массива длина js массива будет отличаться в разных браузерах.

kamushek 24.09.2010 12:23

)) echo '<script>var a = ['.implode(",",$arr).']</script>'; вот так правильней!?

Kolyaj 24.09.2010 12:27

kamushek,
прокатит, если в массиве числа.

DooMer 27.09.2010 14:50

Цитата:

Сообщение от kamushek (Сообщение 71792)
)) echo '<script>var a = ['.implode(",",$arr).']</script>'; вот так правильней!?

повторюсь - json_encode. Не изобретайте мопеды

Gozar 27.09.2010 18:16

DooMer,
не нужно повторяться, каждый использует то, что хочет.

igrok 30.09.2010 16:45

json_encode однозначно :)

Gozar 30.09.2010 16:54

igrok,
зуб дашь?

igrok 01.10.2010 10:06

это конечно ИМХО, может что еще существует, но для человека, который в данный момент не знает как правильно поступить я считаю что данное решение будет самым простым и удобным, а насчет повторяться - когда я к примеру что либо ищу по форумам и вижу что много людей отвечает одинаково, то это говорит о том что решение "работает" и его как минимум можно использовать:)

Gozar 01.10.2010 10:14

igrok, если массив цифровой то использовать нужно implode, потому что он в десятки, а то и в сотни раз быстрее, иногда это очень критично и не нужно тут демагогию разводить.

DooMer 01.10.2010 11:15

Цитата:

Сообщение от Gozar (Сообщение 72631)
implode, потому что он в десятки, а то и в сотни раз быстрее, иногда это очень критично и не нужно тут демагогию разводить.

$arr = array();
$i=0;
while($i<10000000){
	$arr[$i++] = rand(1,1000);
}
$time1 = time();
$json1 = '['.implode(",",$arr).']';
$time1 =time()-$time1;
echo "time1 = $time1 \n";
$time2 = time();
$json2 = json_encode($arr);
$time2 =time()-$time2;
echo "time2 = $time2 \n";

результат
time1 = 359
time2 = 56

Так что действительно, давайте не будем разводить демагогию

diagnost 04.12.2011 13:06

А как лучше из PHP в Javascript передать массив строк?
И как красиво передать массив чисел обратно от клиента серверу?

devote 04.12.2011 13:27

Цитата:

Сообщение от diagnost
А как лучше из PHP в Javascript передать массив строк?

$strings = array('blabla', 'bebebe', 'hahaha');
echo json_encode( $strings );


Цитата:

Сообщение от diagnost
И как красиво передать массив чисел обратно от клиента серверу?

GET'ом/POST'ом

diagnost 04.12.2011 13:29

Спасибо. А когда строковый массив большой, данные изначально неизвестны и исходно передаются в массив, например, из базы данных? То-есть нужно передать массив строк с сервера в массив Javascript клиента.
Применять перебор?

devote 04.12.2011 13:52

а зачем передавать огромный массив, передавай только то что нужно... делай выборку нужных строк из базы и отравляй клиенту. Все то клиенту совать не нужно.

diagnost 04.12.2011 15:02

Т.е на стороне сервера сформировать массив из выборки и потом через json_encode передать этот массив клиенту? Или можно обойтись без формирования массива из выборки на стороне сервера и передавать выборку каким-то образом напрямую в массив клиента?

diagnost 01.01.2012 19:14

У меня через json_encode не передаются русские строки. Это можно решить?

dmitriymar 01.01.2012 19:21

Цитата:

Сообщение от diagnost
У меня через json_encode не передаются русские строки. Это можно решить?

можно
rawurlencode
iconv

diagnost 01.01.2012 19:39

Спасибо. Дело было действительно в кодировке БД. iconv выручил. В "исходном" тексте после передачи русской строки в JS отсутствовали двойные кавычки. Может быть, есть смысл просто их подставлять без перекодирования?

d-kaktus 06.01.2012 15:16

Я внёс бы поправку в код: нельзя забывать про кавычки при implode, это касается строковых значений массива:
<script>var a=['<?=implode("','",$arr)?>'];</script>

Ъь_ 10.01.2012 23:19

Есть несколько решений, например вот

<?php
 function json_fix_cyr($json_str) {
     $cyr_chars = array (
         '\u0430' => 'а', '\u0410' => 'А',
         '\u0431' => 'б', '\u0411' => 'Б',
         '\u0432' => 'в', '\u0412' => 'В',
         '\u0433' => 'г', '\u0413' => 'Г',
         '\u0434' => 'д', '\u0414' => 'Д',
         '\u0435' => 'е', '\u0415' => 'Е',
         '\u0451' => 'ё', '\u0401' => 'Ё',
         '\u0436' => 'ж', '\u0416' => 'Ж',
         '\u0437' => 'з', '\u0417' => 'З',
         '\u0438' => 'и', '\u0418' => 'И',
         '\u0439' => 'й', '\u0419' => 'Й',
         '\u043a' => 'к', '\u041a' => 'К',
         '\u043b' => 'л', '\u041b' => 'Л',
         '\u043c' => 'м', '\u041c' => 'М',
         '\u043d' => 'н', '\u041d' => 'Н',
         '\u043e' => 'о', '\u041e' => 'О',
         '\u043f' => 'п', '\u041f' => 'П',
         '\u0440' => 'р', '\u0420' => 'Р',
         '\u0441' => 'с', '\u0421' => 'С',
         '\u0442' => 'т', '\u0422' => 'Т',
         '\u0443' => 'у', '\u0423' => 'У',
         '\u0444' => 'ф', '\u0424' => 'Ф',
         '\u0445' => 'х', '\u0425' => 'Х',
         '\u0446' => 'ц', '\u0426' => 'Ц',
         '\u0447' => 'ч', '\u0427' => 'Ч',
         '\u0448' => 'ш', '\u0428' => 'Ш',
         '\u0449' => 'щ', '\u0429' => 'Щ',
         '\u044a' => 'ъ', '\u042a' => 'Ъ',
         '\u044b' => 'ы', '\u042b' => 'Ы',
         '\u044c' => 'ь', '\u042c' => 'Ь',
         '\u044d' => 'э', '\u042d' => 'Э',
         '\u044e' => 'ю', '\u042e' => 'Ю',
         '\u044f' => 'я', '\u042f' => 'Я',
  
         '\r' => '',
         '\n' => '<br />',
         '\t' => ''
     );
  
     foreach ($cyr_chars as $cyr_char_key => $cyr_char) {
         $json_str = str_replace($cyr_char_key, $cyr_char, $json_str);
     }
     return $json_str;
 }
  
 echo json_fix_cyr(json_encode(array("собака","кошка"))); // ["собака","кошка"]
 ?>

devote 11.01.2012 02:18

Ъь_,
Господи, это что? А что встроенные возможности PHP вдруг перестали работать?

diagnost 26.01.2012 22:28

Теперь понадобилось вернуть достаточно большой массив обратно из js в php. GET уже не проходит по длине адресной строки. Есть ли способ передать массив целиком, а не поэлементно?

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

SELECT * FROM DB.simple WHERE ind IN ...

Можно ли после IN поставить в строке запроса полученный массив, назовем его к примеру $arr? Тогда какова должна быть внутренняя структура такого массива?

nekto_O 27.01.2012 22:41

Цитата:

Сообщение от diagnost
Можно ли после IN поставить в строке запроса полученный массив

Как вариант:
$query = 'SELECT * FROM DB.simple WHERE ind IN (' . implode(",", $arr) . ')';

diagnost 27.01.2012 22:51

Спасибо. Скорее всего получится работать с SQL и через json_encode. Остается еще вопрос, как передать массив на сервер с помощью POST, желательно без JQuery. Вроде надо использовать JSON в JS, тем более, что JSON поддерживают современные браузеры. Поле, понятно, hidden, но как именно подставить в value массив?

devote 27.01.2012 22:53

Цитата:

Сообщение от nekto_O
$query = 'SELECT * FROM DB.simple WHERE ind IN (' . implode(",", $arr) . ')';

не удивительно почему так быстро ломают сайты

nekto_O 27.01.2012 23:12

Цитата:

Сообщение от devote
не удивительно почему так быстро ломают сайты

а предварительно проверить содержание массива вещества не хватит? или хранимку написать на выборку?

devote 27.01.2012 23:16

Цитата:

Сообщение от nekto_O
а предварительно проверить содержание массива вещества не хватит? или хранимку написать на выборку?

Это ты мне? именно я и удивляюсь на то что людям плевать на свой сервер. Пишут как попало. В первую очередь это сервер, и программировать серверные приложения нужно хорошо обдумывая, безопасность превыше всего. Перед запросами в БД, нужно экранировать все данные которые втыкаются в запрос, иначе могут сделать sql injection. А это и дураку понятно к чему приведет.

devote 27.01.2012 23:26

ну в противном случае хотябы так прогнали бы:
implode( ',', array_map( 'mysql_real_escape_string', $arr ) )
Куда меньше возможностей сделать инъекцию.

nekto_O 27.01.2012 23:27

Цитата:

Сообщение от devote
Перед запросами в БД, нужно экранировать все данные которые втыкаются в запрос, иначе могут сделать sql injection

Цитата:

Сообщение от nekto_O
предварительно проверить и обработать массив

лады пусть так (!) :lol:
Цитата:

Сообщение от devote
А это и дураку понятно к чему приведет

Если уж на то пошло, тогда и
select * from ...
это быдло-запрос)))

devote 27.01.2012 23:30

Цитата:

Сообщение от nekto_O
это быдло-запрос)))

смотря в каких случаях, если таблица огромная, то конечно использование знака "*", приводит к нагрузке... Если же в таблице пусть максимум и сотня записей, это не сильно страшно.

diagnost 27.01.2012 23:43

Что-нибудь в этом роде будет работать?
<INPUT type = "hidden" name = "Yes" value=<script>JSON.stringify(arr)</script>>

nekto_O 27.01.2012 23:44

Цитата:

Сообщение от devote
смотря в каких случаях, если таблица огромная, то конечно использование знака "*", приводит к нагрузке... Если же в таблице пусть максимум и сотня записей, это не сильно страшно.

вообще, если по уму, то для выборки вьюхи надо использовать, а для инсерта/апдейта/делита хранимки. А за select * from внутри outer apply вообще расстреливать надо...

devote 27.01.2012 23:53

Цитата:

Сообщение от nekto_O
вообще, если по уму, то для выборки вьюхи надо использовать, а для инсерта/апдейта/делита хранимки. А за select * from внутри outer apply вообще расстреливать надо...

Дык ты так и не понял к чему я поднял этот разговор? Мне срать кто что и как там использует. Я написал не потому что автор что-то там юзает, а потому что ты дал ГОВЕНЫЙ пример спрашивающему, именно от таких примеров и рождаются говнокодеры. Либо давай нормальный полный пример, либо ничего не давай. А растить и помогать появляться говнокодерам себе же в минус. Так как ты немного забыл о том что в недалеком будущем, этот код может попасться тебе, если кто-то попросит тебя его доделать/переделать и сам же будешь плеваться от того что там понаписано.

diagnost 28.01.2012 00:01

Сейчас проверил на другом примере: JSON работает в firefox, в IE нет.


Часовой пояс GMT +3, время: 11:43.