Проблема заключается в том, что компилятор видит 2 перегрузки одного и того же метода, оба из которых содержат одни и те же аргументы (в данном случае - нет) и одинаковое возвращаемое значение. Вы не можете предоставить такое определение. Самый чистый способ сделать это - использовать SFINAE для возвращаемого значения функции:
template <class T>
class check
{
public:
template< class U = T>
static typename std::enable_if<std::is_same<U, int>::value, U>::type readVal()
{
return BuffCheck.getInt();
}
template< class U = T>
static typename std::enable_if<std::is_same<U, double>::value, U>::type readVal()
{
return BuffCheck.getDouble();
}
};
Таким образом, вы предоставляете 2 разных перегрузки. Один возвращает int, другой возвращает double, и только один может быть создан с использованием некоторого T.
вот один, который я не вижу в качестве опции. он похож на использование ajax, но явно отличается.
сначала устанавливает источник скрипта непосредственно в файл PHP.
<script type="text/javascript" src="url_to_your_php_file.php" /></script>
вы даже можете передать переменную обратно в PHP файл, такой как этот пример:
<script type="text/javascript" src="url_to_your_php_file.php?var1=value1" /></script>
, затем в «your_php_file.php»:
<?php
// THIS IS A SIMPLE EXAMPLE
// it demonstrates one method of using the src attribute to link
// to a PHP file which can generate javascripts dynamically
// and share data between PHP and javascript
// you may take this learning example and develop it further
// relying on your own coding skills for validating data
// and avoiding errors, of course
header( 'content-type: text/javascript' );
// if you pass a $_GET variable from the javascript
// you should add code to validate your $_GET variable(s)
// you can add code to query a database
// using $_GET['var1'] or some other criteria
// you can add simple variable assignments
$value = 'some value';
// for the OP's needs (assumes the class object has been defined)
$val = $myService->getValue();
?>
function name() {
// pay attention because you need to use quotes properly
// and account for possible quotes in the variable strings
// to avoid both php and javascript errors
// example assumes $val has been returned as a string
// validate $val as needed using your method of choice
var example1 = '<?php echo '"' . $val . '"'; ?>';
var example2 = '<?php echo '"' . $value . '"'; ?>';
var example3 = '<?php echo '"some other data"'; ?>';
alert( example1 + ' / ' + example2 );
}
<?php
// you may even want to include additional files (.php or .js, etc)
@include 'local_path_to_some_other_js_file.js';
@include 'local_path_to_some_other_php_file.php';
exit;
?>
myPlugin.start($val); // tried this, didn't work
Это не работает, потому что $val
не определено для javascript, т.е. php ничего не выводил для $val
. Попробуйте просмотреть источник в своем браузере, и вот что вы увидите:
myPlugin.start(); // tried this, didn't work
И
<?php myPlugin.start($val); ?> // this didn't work either
Это не работает, потому что php попытается обработать myPlugin
как константа, и когда это не удается, он попытается рассматривать его как строку 'myPlugin'
, которую он попытается связать с выходом функции php start()
, и поскольку это не определено, это приведет к фатальной ошибке
И
myPlugin.start(<?=$val?> // this works sometimes, but sometimes it fails
Хотя это, скорее всего, сработает, так как php создает допустимый javascript с ожидаемыми аргументами, если он не работает, скорее всего, потому что myPlugin
не готов все же. Проверьте свой порядок выполнения.
Также вы должны заметить, что установка php out небезопасна и должна быть отфильтрована с помощью json_encode()
EDIT
Поскольку я didn Не заметите отсутствующую скобку в myPlugin.start(<?=$val?>
: - \
Как указывает @Second Rikudo, для правильной работы $val
необходимо будет содержать закрывающую скобку, например: $val="42);"
Значение php теперь будет генерировать myPlugin.start(42);
и будет работать как ожидалось при выполнении javascript
myPlugin.start(<?=json_encode($val)?>);
– kingprawn
30 January 2015 в 09:57
Я попробую более простой ответ:
Во-первых, давайте разобраться в потоке событий, когда страница обслуживается с нашего сервера:
Итак, главное, что нужно запомнить здесь, это HTTP-апатрид. После того, как запрос покинул сервер, сервер не может его коснуться. Таким образом, это оставляет наши возможности:
Вот главный вопрос, который вы должны задать себе:
Веб-сайты в основном основаны на страницах, а время загрузки страницы должно быть как можно быстрее (например, Википедия).
Отправка большего количества запросов от клиента после веб-приложений больше, чем AJAX, и совершить много круговых поездок, чтобы быстро получить информацию о клиенте. первоначальный запрос выполняется медленно, так как требует больше HTTP-запросов, которые имеют значительные накладные расходы. Более того, для асинхронности требуется асинхронность , поскольку для запроса AJAX требуется обработчик, когда он будет завершен.
Я бы не не рекомендовал сделать другой запрос , если только ваш сайт является приложением для получения этой информации с сервера.
Вы хотите быстрое время отклика, которое имеет огромное влияние на время конверсии и загрузки. Выполнение ajax-запросов медленнее для первоначального времени безотказной работы в этом случае и ненужных.
У вас есть два способа решить проблему
Настройка файла cookie действительно не очень сложна, вы просто назначаете ему значение:
setcookie("MyCookie", $value); // sets the cookie to the value, remember, do not
// set it with HTTP only to true.
Затем вы можете прочитать его с помощью JavaScript с помощью document.cookie
:
Вот краткий рулонный парсер, но ответ, который я связал прямо над этим, имеет более проверенные:
var cookies = document.cookie.split(";").
map(function(el){ return el.split("="); }).
reduce(function(prev,cur){ prev[cur[0]] = cur[1];return prev },{});
cookies["MyCookie"] // value set with php.
Cookies хороши для небольших данных. Это то, что часто делают службы отслеживания.
Как только у нас будет больше данных, мы можем кодировать его с помощью JSON внутри JS-переменной:
<script>
var myServerData = <?=json_encode($value)?>; // don't forget to sanitize
//server data
</script>
Предполагая, что $value
- json_encode
на стороне PHP (это обычно есть). Этот метод - это то, что StackOverflow делает со своим чатом, например (только с использованием .net вместо php).
Если вы пишете приложение - внезапно начальное время загрузки равно всегда важна, как текущая производительность приложения, и начинает платить за загрузку данных и кода отдельно.
В моем ответе здесь объясняется, как загружать данные с помощью AJAX в JavaScript:
function callback(data){
// what do I do with the response?
}
var httpRequest = new XMLHttpRequest;
httpRequest.onreadystatechange = function(){
if (httpRequest.readyState === 4) {// request is done
if (httpRequest.status === 200) {// successfully
callback(httpRequest.responseText);// we're calling our method
}
}
};
httpRequest.open('GET', "/echo/json");
httpRequest.send();
Или с jQuery:
$.get("/your/url").done(function(data){
// what do I do with the data?
});
Теперь сервер просто должен содержать маршрут / файл /your/url
, содержащий код, который захватывает данные и делает это что-то с этим, в вашем случае:
<$php
...
$val = myService->getValue(); // makes an api and db call
echo json_encode($val); // write it to the output
$>
Таким образом, наш JS-файл запрашивает данные и показывает их, а не запрашивает код или макет. Это чище и начинает окупаться по мере того, как приложение становится выше. Это также лучшее разделение проблем, и это позволяет тестировать код на стороне клиента без какой-либо связанной с ним технологии на стороне сервера. Это еще один плюс.
Postscript: вы должны очень знать об атаке XSS векторы, когда вы вводите что-либо от PHP к JavaScript. очень трудно избежать значений правильно, и это чувствительно к контексту. Если вы не знаете, как обращаться с XSS или не знаете об этом, прочитайте эту статью OWASP , эту [ и этот вопрос .
parse
и stringify
). JSON по определению представляет собой последовательность символов.
– cHao
20 May 2014 в 02:47
{}
- действительный объект JSON - см. json.org
– Benjamin Gruenbaum
20 May 2014 в 04:12
\u2028
и т. Д. Вы должны явно сказать, что это не делать этого.
– cHao
20 May 2014 в 16:02
Мне очень нравится, как Wordpress работает с его функциями enqueue и localize , поэтому после этой модели я написал простой класс для размещения скриптов на странице в соответствии с зависимостей сценария и получения дополнительных данных для скрипта.
class mHeader {
private $scripts = array();
/**
* @param string $id unique script identifier
* @param string $src script src attribute
* @param array $deps an array of dependencies ( script identifiers ).
* @param array $data an array, data that will be json_encoded and available to the script.
*/
function enqueue_script( $id, $src, $deps = array(), $data = array() ) {
$this->scripts[$id] = array( 'src' => $src, 'deps' => $deps, 'data' => $data );
}
private function dependencies( $script ) {
if ( $script['deps'] ) {
return array_map( array( $this, 'dependencies' ), array_intersect_key( $this->scripts, array_flip( $script['deps'] ) ) );
}
}
private function _unset( $key, &$deps, &$out ) {
$out[$key] = $this->scripts[$key];
unset( $deps[$key] );
}
private function flattern( &$deps, &$out = array() ) {
foreach( $deps as $key => $value ) {
empty($value) ? $this->_unset( $key, $deps, $out ) : $this->flattern( $deps[$key], $out );
}
}
function print_scripts() {
if ( !$this->scripts ) return;
$deps = array_map( array( $this, 'dependencies' ), $this->scripts );
while ( $deps )
$this->flattern( $deps, $js );
foreach( $js as $key => $script ) {
$script['data'] && printf( "<script> var %s = %s; </script>" . PHP_EOL, key( $script['data'] ), json_encode( current( $script['data'] ) ) );
echo "<script id=\"$key-js\" src=\"$script[src]\" type=\"text/javascript\"></script>" . PHP_EOL;
}
}
}
Функция enqueue_script()
предназначена для добавления сценария, установки сума и зависимостей в других сценариях и дополнительных данных, необходимых для скрипт.
$header = new mHeader();
$header->enqueue_script( 'jquery-ui', '//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js', array( 'jquery' ) );
$header->enqueue_script( 'jquery', '//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js' );
$header->enqueue_script( 'custom-script', '//custom-script.min.js', array( 'jquery-ui' ), array( 'mydata' => array( 'value' => 20 ) ) );
$header->print_scripts();
И, метод print_scripts()
вышеприведенного примера отправит этот вывод:
<script id="jquery-js" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" type="text/javascript"></script>
<script id="jquery-ui-js" src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js" type="text/javascript"></script>
<script> var mydata = {"value":20}; </script>
<script id="custom-script-js" src="//custom-script.min.js" type="text/javascript"></script>
Независимо от того, что скрипт jquery находится в очереди после 'jquery-ui', он печатается ранее, потому что он определен в 'jquery-ui', который зависит от `jquery '. Дополнительные данные для «custom-script» находятся внутри нового блока сценариев и размещаются перед ним, он содержит mydata
объект, который содержит дополнительные данные, теперь доступный для «пользовательского сценария».
Так я это делаю (есть много способов):
Пример:
ШАГ 1
<?php
$servername = "localhost";
$username = "";
$password = "";
$dbname="";
$conn = new mysqli($servername, $username, $password,$dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT id, name ,image FROM phone";
$result = $conn->query($sql);
while($row =$result->fetch_assoc()){
$v[]=$row;
}
echo json_encode($v);
$conn->close();
?>
ШАГ 2
function showUser(fnc) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
// STEP 3
var p=JSON.parse(this.responseText);}
}
}
Я обычно использую атрибуты data- * в html.
<div class="service-container" data-service="<?php echo $myService->getValue(); ?>">
</div>
<script>
$(document).ready(function() {
$('.service-container').each(function() {
var container = $(this);
var service = container.data('service');
// service variable now contains the value of $myService->getValue();
});
});
</script>
В этом примере используется jQuery, но может быть адаптирован для другой библиотеки или ванильного Javascript.
Вы можете узнать больше о свойство набора данных здесь: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.dataset
<script>
var jsvar = <?php echo json_encode($PHPVar); ?>;
</script>
json_encode () требует:
$PHPVar
кодируется как UTF-8, Unicode. <?php
$your_php_variable= 22;
echo "<script type='text/javascript'>var your_javascript_variable = $your_php_variable;</script>";
?>
, и это сработает. Это просто назначение переменной javascript, а затем передача значения существующей переменной php. Поскольку php записывает здесь строки javascript, он имеет значение переменной php и может передавать ее напрямую.
Просто используйте один из следующих способов.
<script type="text/javascript">
var js_variable = '<?php echo $php_variable;?>';
<script>
ИЛИ
<script type="text/javascript">
var js_variable = <?php echo json_encode($php_variable); ?>;
</script>
В соответствии с вашим кодом
<$php
$val = $myService->getValue(); // makes an api and db call
echo '<span id="value">'.$val.'</span>';
$>
Теперь вы можете получить значение с помощью DOM, используйте innerHTML идентификатора span, в этом случае вам не нужно делать вызов на сервер или ajax или любую другую вещь.
Ваша страница будет печатать его с помощью php, и ваш javascript получит значение с помощью DOM.
<
и >
. Также были предложены аналогичные решения.
– Michał Perłakowski
18 April 2017 в 10:26
Я предполагаю, что данные для передачи - это строка.
Как отмечают другие комментаторы, AJAX - одно из возможных решений, но недостатки превосходят плюсы: он имеет задержку, и это сложнее (для этого требуется код для получения значения как на стороне сервера, так и на стороне клиента), когда должна быть достаточно простая функция экранирования.
Итак, мы вернулись к экранированию. json_encode($string)
работает , если вы сначала кодируете исходную строку как UTF-8, если это еще не так, потому что для json_encode
требуются данные UTF-8. Если строка находится в ISO-8859-1, вы можете просто использовать json_encode(utf8_encode($string))
; в противном случае вы всегда можете использовать iconv
для выполнения преобразования.
Но есть большая проблема. Если вы используете его в событиях, вам нужно запустить htmlspecialchars()
в результате, чтобы сделать правильный код. И тогда вы должны быть осторожны, чтобы использовать двойные кавычки для включения события или всегда добавлять ENT_QUOTES
в htmlspecialchars. Например:
<?php
$myvar = "I'm in \"UTF-8\" encoding and I have <script>script tags</script> & ampersand!";
// Fails:
//echo '<body onload="alert(', json_encode($myvar), ');">';
// Fails:
//echo "<body onload='alert(", json_encode($myvar), ");'>";
// Fails:
//echo "<body onload='alert(", htmlspecialchars(json_encode($myvar)), ");'>";
// Works:
//echo "<body onload='alert(", htmlspecialchars(json_encode($myvar), ENT_QUOTES), ");'>";
// Works:
echo '<body onload="alert(', htmlspecialchars(json_encode($myvar)), ');">';
echo "</body>";
Однако вы не можете использовать htmlspecialchars
для обычного JS-кода (код, заключенный в теги <script>
... </script>
). Это позволяет использовать эту функцию, подверженную ошибкам, забыв htmlspecialchars
результат при записи кода события.
Можно написать функцию, которая не имеет этой проблемы, и может использоваться как в событиях и в регулярном JS-коде, если вы включаете свои события всегда в одинарные кавычки или всегда в двойные кавычки. Вот мое предложение, требующее, чтобы они были в двойных кавычках (что я предпочитаю):
<?php
// Optionally pass the encoding of the source string, if not UTF-8
function escapeJSString($string, $encoding = 'UTF-8')
{
if ($encoding != 'UTF-8')
$string = iconv($encoding, 'UTF-8', $string);
$flags = JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS|JSON_HEX_QUOT|JSON_UNESCAPED_SLASHES;
$string = substr(json_encode($string, $flags), 1, -1);
return "'$string'";
}
Для функции требуется PHP 5.4+. Пример использования:
<?php
$myvar = "I'm in \"UTF-8\" encoding and I have <script>script tags</script> & ampersand!";
// Note use of double quotes to enclose the event definition!
echo '<body onload="alert(', escapeJSString($myvar), ');">';
// Example with regular code:
echo '<script>alert(', escapeJSString($myvar), ');</script>';
echo '</body>';
Я получил простой способ присвоить переменные JavaScript с помощью PHP.
Он использует атрибуты данных HTML5 для хранения переменных PHP, а затем присваивается JavaScript при загрузке страницы.
Полный учебник можно найти здесь здесь
Пример:
<?php
$variable_1 = "QNimate";
$variable_2 = "QScutter";
?>
<span id="storage" data-variable-one="<?php echo $variable_1; ?>" data-variable-two="<?php echo $variable_2; ?>"></span>
<?php
Hers - это код JS
var variable_1 = undefined;
var variable_2 = undefined;
window.onload = function(){
variable_1 = document.getElementById("storage").getAttribute("data-variable-one");
variable_2 = document.getElementById("storage").getAttribute("data-variable-two");
}
Вот трюк:
<?php
$name = 'PHP variable';
echo '<script>';
echo 'var name = ' . json_encode($name) . ';';
echo '</script>';
<?
<script>
console.log("i am everywhere " + name);
</script>
, предположим, что ваша переменная всегда целочисленна, в этом случае это проще
<?PHP
$number = 4;
echo '<script>';
echo 'var number = ' . $number . ';';
echo 'alert(number);';
echo '</script>';
?>
output:
<script>var number = 4;alert(number);</script>
, предположим, что ваша переменная не является целым числом, но если вы пытаетесь выполнить выше метод, вы получите что-то вроде этого:
<script>var number = abcd;alert(number);</script>
, но в javascript это синтаксическая ошибка.
, поэтому в php у нас есть вызов функции json_encode
, который кодирует string в json-объект.
<?PHP
$number = 'abcd';
echo '<script>';
echo 'var number = ' . json_encode($number) . ';';
echo 'alert(number);';
echo '</script>';
?>
с abcd
в json это "abcd"
, поэтому он выглядит так:
<script>var number = "abcd";alert(number);</script>
Вы можете использовать тот же метод для массивов :
<?PHP
$details = [
'name' => 'supun',
'age' => 456,
'weight' => '55'
];
echo '<script>';
echo 'var details = ' . json_encode($details) . ';';
echo 'alert(details);';
echo 'console.log(details);';
echo '</script>';
?>
и ваш javascript выглядит так:
<script>var details = {"name":"supun","age":456,"weight":"55"};alert(details);console.log(details);</script>
консольный выход
Для тех, у кого есть проблемы с использованием кода ниже, и он продолжает показывать <?php echo $username?>
или что-то вроде этого. Редактируйте httpd.conf в разделе mime_module, добавив это приложение AddType / x-httpd-php .html .htm. потому что он может отключиться по умолчанию.
<?php
$username = 1;
?>
<script type="text/javascript">
var myData = <?php echo $username ?>;
console.log(myData);
alert(myData);
</script>
$username === "hello"
, то у вас есть var myData = hello;
, который будет прерываться ужасно.
– Madara Uchiha♦
2 January 2016 в 18:43
попробуйте это
<?php
echo "<script> var x = ". json_encode($phpVariable)."</script>";
?>
-
-После попытки этого какое-то время Хотя он работает, однако он замедляет работу. поскольку php является скриптом на стороне сервера, а javascript - пользователем.
$phpVariable = '42"; alert("I am evil!");';
– Madara Uchiha♦
2 September 2014 в 11:43
var1=value1
. Поскольку это означает, что ваш скрипт будет разбит, если данные содержат символ'
. – Quentin 19 August 2015 в 14:18var1 != [some HTML code]
... ЧИСТЫЙvar1=="value1"
. просто неправильно, вы ошибаетесь, что я что-то пропустил. сценарий EXAMPLE завершен и, как вы видите, не генерирует никакого HTML-кода - и OP не упоминает HTML. он не заслуживает нисходящего спутника с помощью спускового крючка счастливого байдара - убирает downvote – aequalsb 20 August 2015 в 15:50$val
, и который иногда работает, а иногда нет:myPlugin.start(<?=$val?> // this works sometimes, but sometimes it fails
– Quentin 20 August 2015 в 16:12