Làm cách nào để chuyển các biến JavaScript sang PHP?


150

Tôi muốn chuyển các biến JavaScript cho PHP bằng cách sử dụng một đầu vào ẩn trong một biểu mẫu.

Nhưng tôi không thể nhận được giá trị của $_POST['hidden1']thành $salarieid. Có điều gì sai không?

Đây là mã:

<script type="text/javascript">
    // View what the user has chosen
    function func_load3(name) {
        var oForm = document.forms["myform"];
        var oSelectBox = oForm.select3;
        var iChoice = oSelectBox.selectedIndex;
        //alert("You have chosen: " + oSelectBox.options[iChoice].text);
        //document.write(oSelectBox.options[iChoice].text);
        var sa = oSelectBox.options[iChoice].text;
        document.getElementById("hidden1").value = sa;
    }
</script>

<form name="myform" action="<?php echo $_SERVER['$PHP_SELF']; ?>" method="POST">
    <input type="hidden" name="hidden1" id="hidden1" />
</form>

<?php
   $salarieid = $_POST['hidden1'];
   $query = "select * from salarie where salarieid = ".$salarieid;
   echo $query;
   $result = mysql_query($query);
?>

<table>
   Code for displaying the query result.
</table>

2
Bạn có thể lưu trữ giá trị biến js trong cookie và sau đó truy cập biến đó trong cookie php.
shasi kanth

2
@shasikanth - bạn có thể làm điều đó, nhưng cookie sẽ không được đặt cho đến lần thứ hai trang được xem . Và tại thời điểm đó, nó sẽ là giá trị từ lượt xem trang đầu tiên - nó luôn luôn ở phía sau. Một cookie không phải là một cơ chế để tự động chuyển thông tin trở lại máy chủ; bạn phải làm một cái gì đó khác để làm mới trang, ví dụ: POST một biểu mẫu hoặc thực hiện cuộc gọi Ajax. Và nếu bạn đang làm một trong những điều đó, không có lý do gì để sử dụng cookie - chỉ cần chuyển thông tin trong cơ chế bạn đang sử dụng. Ngoài ra, một cookie sẽ tồn tại sau khi trang không còn nữa - không phải là mục đích của câu hỏi này.
ToolmakerSteve

Câu trả lời:


90

Bạn không thể chuyển các giá trị biến từ mã JavaScript của trang hiện tại sang mã PHP của trang hiện tại ... Mã PHP chạy ở phía máy chủ và nó không biết gì về những gì đang diễn ra ở phía máy khách.

Bạn cần chuyển các biến sang mã PHP từ biểu mẫu HTML bằng cách sử dụng một cơ chế khác, chẳng hạn như gửi biểu mẫu bằng các phương thức GET hoặc POST.

<DOCTYPE html>
<html>
  <head>
    <title>My Test Form</title>
  </head>

  <body>
    <form method="POST">
      <p>Please, choose the salary id to proceed result:</p>
      <p>
        <label for="salarieids">SalarieID:</label>
        <?php
          $query = "SELECT * FROM salarie";
          $result = mysql_query($query);
          if ($result) :
        ?>
        <select id="salarieids" name="salarieid">
          <?php
            while ($row = mysql_fetch_assoc($result)) {
              echo '<option value="', $row['salaried'], '">', $row['salaried'], '</option>'; //between <option></option> tags you can output something more human-friendly (like $row['name'], if table "salaried" have one)
            }
          ?>
        </select>
        <?php endif ?>
      </p>
      <p>
        <input type="submit" value="Sumbit my choice"/>
      </p>
    </form>

    <?php if isset($_POST['salaried']) : ?>
      <?php
        $query = "SELECT * FROM salarie WHERE salarieid = " . $_POST['salarieid'];
        $result = mysql_query($query);
        if ($result) :
      ?>
        <table>
          <?php
            while ($row = mysql_fetch_assoc($result)) {
              echo '<tr>';
              echo '<td>', $row['salaried'], '</td><td>', $row['bla-bla-bla'], '</td>' ...; // and others
              echo '</tr>';
            }
          ?>
        </table>
      <?php endif?>
    <?php endif ?>
  </body>
</html>

@Sergey, tôi đã sử dụng biểu mẫu gửi ở đây với phương thức POST, tôi không biết tại sao nó không hoạt động. Bạn có biết tại sao? Và làm thế nào để giải quyết điều đó?
CN Jiangong

@sergey, vậy mình có cần dùng ajax không? Thật ra, tôi là familliar với điều đó.
CN Jiangong

Trên thực tế, tôi đã sử dụng phương pháp của bạn trong hộp chọn một cấp trước đây. Nhưng bây giờ tôi đã thực hiện một hộp chọn ba chuỗi, vì vậy tôi không thể sử dụng phương pháp của bạn.
CN Jiangong

Tại thời điểm này: Có, bạn cần sử dụng công nghệ AJAX. Nếu bạn gặp rắc rối với việc nhận ra, tôi nghĩ tôi có thể giúp đỡ.
Serge Kuznetsov

3
@MadaraUchiha OP đã sử dụng các mysql_chức năng; nó sẽ không phải là mục tiêu của việc trả lời câu hỏi này bằng cách viết lại hoàn chỉnh.
Ja͢ck

26

Chỉ cần lưu nó trong một cookie:

$(document).ready(function () {
  createCookie("height", $(window).height(), "10");
});

function createCookie(name, value, days) {
  var expires;
  if (days) {
    var date = new Date();
    date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
    expires = "; expires=" + date.toGMTString();
  }
  else {
    expires = "";
  }
  document.cookie = escape(name) + "=" + escape(value) + expires + "; path=/";
}

Và sau đó đọc nó với PHP:

<?PHP
   $_COOKIE["height"];
?>

Nó không phải là một giải pháp đẹp, nhưng nó hoạt động.


2
Cuối cùng! một lựa chọn mà làm việc! Bây giờ tôi đã tìm kiếm hàng giờ để lựa chọn, tạo ra một trò chơi và muốn gửi điểm số cao nhất đến cơ sở dữ liệu, đã sửa nó ngay bây giờ! Chúc mừng!
Cid-El

1
Thật ra, đó là một giải pháp tuyệt vời! đi từ php sang javascript thật dễ dàng. từ javascript đến php là không dễ dàng. sử dụng cookie rất đơn giản, thanh lịch. không có bs .. !! tất nhiên nếu khách hàng tắt cookie ,,, đó là một vấn đề cần xử lý với mặc định ..
JamesAD-0

Bạn có thể vui lòng cho tôi biết cách sử dụng điều $ _COOKIE ["height"] để lấy tên, giá trị trong đó không? Cảm ơn. Không làm việc cho tôi.
Zac

4
Mặc dù tất cả các upvote, đây không phải là một giải pháp tốt. Lý do: máy chủ không nhìn thấy cookie cho đến lần tiếp theo trang được trình duyệt yêu cầu . Nó luôn luôn "một đằng sau". Lần đầu tiên trang được mở trong trình duyệt, sẽ không có bất kỳ cookie nào cả. điều này có chấp nhận được không? Lần tiếp theo trang được mở trong trình duyệt, sẽ có cookie từ lần đầu tiên. Đối với một giá trị không đổi , chẳng hạn như ví dụ này, có thể chấp nhận được (mặc dù không hoạt động lần đầu tiên !!). Bây giờ hãy xem xét một giá trị động , chẳng hạn như datetime hiện tại. php sẽ thấy datetime PREVIOUS, không phải bây giờ. Sử dụng ajax.
ToolmakerSteve

20

Có một số cách chuyển các biến từ JavaScript sang PHP (tất nhiên không phải là trang hiện tại).

Bạn có thể:

  1. Gửi thông tin dưới dạng như đã nêu ở đây (sẽ dẫn đến làm mới trang)
  2. Vượt qua nó trong Ajax (một số bài viết ở đây về điều đó) (không có làm mới trang)
  3. Tạo một yêu cầu HTTP thông qua một yêu cầu XMLHttpRequest (không cần làm mới trang) như thế này:

 if (window.XMLHttpRequest){
     xmlhttp = new XMLHttpRequest();
 }

else{
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
 }

 var PageToSendTo = "nowitworks.php?";
 var MyVariable = "variableData";
 var VariablePlaceholder = "variableName=";
 var UrlToSend = PageToSendTo + VariablePlaceholder + MyVariable;

 xmlhttp.open("GET", UrlToSend, false);
 xmlhttp.send();

Tôi chắc chắn rằng điều này có thể được thực hiện để trông lạ hơn và lặp qua tất cả các biến và không có gì - nhưng tôi đã giữ nó cơ bản để làm cho người mới dễ hiểu hơn.


làm thế nào về cách tôi sẽ nhận được các mảng db và chuyển nó vào javascript mỗi khi tôi gửi một biểu mẫu mới. sau đó biến trong javascript cũng sẽ thay đổi. làm sao? giúp tôi. :(
Vincent

3
Ajax thực sự là XMLHttpRequest, sau này chỉ là một thuật ngữ kỹ thuật cho nó.
Alex C.

14

Dưới đây là ví dụ hoạt động: Nhận giá trị biến javascript trên cùng một trang trong php.

<script>
var p1 = "success";
</script>

<?php
echo "<script>document.writeln(p1);</script>";
?>

1
Tôi đã thử consept này sau đó thực sự hoạt động, nhưng nếu tôi thử như thế này: <? Php var x = <script> document.writeln (p1); </ script> ";?>, Thì echo x; Nó không hoạt động. Bạn có cách nào khác không?
Juna serbaserbi

3
bạn có thể thử như thế này <script> var p1 = "thành công"; </ script> <? php $ x = "<script> document.writeln (p1); </ script>"; tiếng vang $ x; ?>
Arslan Tabassum

3
Php trong trường hợp này chỉ đơn giản là lặp lại javascript đến trang dưới dạng một chuỗi. Javascript không được truyền cho php.
Ben

Vâng, đó là những gì chúng ta cần làm ... đôi khi chúng ta cần sử dụng giá trị JavaScript trong php trên cùng một trang & không cần làm mới trang ... sau đó nó sẽ hoạt động như bùa mê .. :)
Arslan Tabassum

1
@ArslanTabassum Không, bạn hiểu nhầm ý kiến. php không bao giờ thấy giá trị của p1. echo "<script>document.writeln(p1);</script>";sử dụng biến javascript p1trong javascript , không phải trong php. document.writelnlà một chức năng javascript , mà bạn đang thực thi, trong trình duyệt, trong khi trình duyệt đang xây dựng trang HTML.
ToolmakerSteve

6

PHP chạy trên máy chủ trước khi trang được gửi đến người dùng, JavaScript được chạy trên máy tính của người dùng sau khi nhận được, vì vậy tập lệnh PHP đã được thực thi.

Nếu bạn muốn chuyển một giá trị JavaScript cho tập lệnh PHP, bạn phải thực hiện một XMLHttpRequest để gửi dữ liệu trở lại máy chủ.

Đây là một câu hỏi trước đây mà bạn có thể theo dõi để biết thêm thông tin: Hướng dẫn Ajax

Bây giờ nếu bạn chỉ cần truyền một giá trị biểu mẫu cho máy chủ, bạn cũng có thể chỉ cần thực hiện một bài đăng mẫu bình thường, điều đó cũng tương tự, nhưng toàn bộ trang phải được làm mới.

<?php
if(isset($_POST))
{
  print_r($_POST);
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
  <input type="text" name="data" value="1" />
  <input type="submit" value="Submit" />
</form>

Nhấp vào gửi sẽ gửi trang và in ra dữ liệu đã gửi.


1
@Zurahn, vâng, có lẽ tôi đã thử sử dụng XMLHttpRequest, vì vậy tôi không thể chuyển giá trị javascript cho tập lệnh php trong cùng một trang bằng javascript? Tôi đã tìm kiếm rất nhiều, ai đó nói rằng nó có thể được thực hiện với đầu vào ẩn trong mẫu. Tôi có cần phải thử giải pháp này furthur?
CN Jiangong

6

Tôi đã cố gắng tự mình tìm ra điều này và sau đó nhận ra rằng vấn đề là đây là một cách nhìn ngược về tình huống. Thay vì cố gắng chuyển mọi thứ từ JavaScript sang php, có lẽ tốt nhất là đi theo cách khác, trong hầu hết các trường hợp. Mã PHP thực thi trên máy chủ và tạo mã html (và có thể cả tập lệnh java). Sau đó trình duyệt tải trang và thực thi tập lệnh html và java.

Có vẻ như cách hợp lý để tiếp cận các tình huống như thế này là sử dụng PHP để tạo JavaScript và html mà bạn muốn và sau đó sử dụng JavaScript trong trang để làm bất cứ điều gì PHP không thể làm. Có vẻ như điều này sẽ cung cấp cho bạn những lợi ích của cả PHP và JavaScript theo cách khá đơn giản và dễ hiểu.

Một điều tôi đã làm là mang lại sự xuất hiện của việc chuyển mọi thứ sang PHP từ trang của bạn một cách nhanh chóng là sử dụng thẻ hình ảnh html để gọi mã PHP. Một cái gì đó như thế này:

<img src="pic.php">

Mã PHP trong pic.php thực sự sẽ tạo mã html trước khi trang web của bạn được tải, nhưng mã html đó về cơ bản được yêu cầu khi đang di chuyển. Mã php ở đây có thể được sử dụng để tạo một hình ảnh trên trang của bạn, nhưng nó có thể có bất kỳ lệnh nào bạn thích ngoài nó trong đó. Có thể nó thay đổi nội dung của một số tệp trên máy chủ của bạn, v.v ... Mặt trái của điều này là mã php có thể được thực thi từ html và tôi giả sử JavaScript, nhưng mặt trái là đầu ra duy nhất nó có thể đặt trên trang của bạn là hình ảnh. Bạn cũng có tùy chọn chuyển các biến sang mã php thông qua các tham số trong url. Trang quầy sẽ sử dụng kỹ thuật này trong nhiều trường hợp.


5

Chúng tôi có thể dễ dàng chuyển các giá trị ngay cả trên các trang giống nhau / khác nhau bằng cách sử dụng cookie được hiển thị trong mã như sau (Trong trường hợp của tôi, tôi đang sử dụng nó với tích hợp facebook) -

function statusChangeCallback(response) {
    console.log('statusChangeCallback');
    if (response.status === 'connected') {
        // Logged into your app and Facebook.
        FB.api('/me?fields=id,first_name,last_name,email', function (result) {
            document.cookie = "fbdata = " + result.id + "," + result.first_name + "," + result.last_name + "," + result.email;
            console.log(document.cookie);
        });
    }
}

Và tôi đã truy cập nó (trong bất kỳ tệp nào) bằng cách sử dụng -

<?php 
    if(isset($_COOKIE['fbdata'])) { 
        echo "welcome ".$_COOKIE['fbdata'];
    }
?>

5

Đây là cách tôi đã làm (Tôi cần chèn múi giờ cục bộ vào PHP:

<?php
    ob_start();
?>

<script type="text/javascript">

    var d = new Date();
    document.write(d.getTimezoneOffset());
</script>

<?php
    $offset = ob_get_clean();
    print_r($offset);

2

Là hàm của bạn, thiết lập giá trị biểu mẫu ẩn, được gọi? Nó không có trong ví dụ này. Bạn sẽ không gặp vấn đề gì khi sửa đổi giá trị ẩn trước khi gửi biểu mẫu trở lại máy chủ.


@perstilence, bạn nói đúng, tôi đã không gọi hàm. Bạn có biết làm thế nào để gọi nó trong php?
CN Jiangong

hmm Có vẻ như bạn muốn gọi nó khi ai đó chọn một cái gì đó trong biểu mẫu của bạn / trình xử lý onClick. Gọi nó từ PHP không có nghĩa gì cả. Ai đó chọn một giá trị biểu mẫu, hàm của bạn kích hoạt, cập nhật giá trị biểu mẫu ẩn, sau đó chuyển sang php trên bài đăng mẫu. Không?
dịch hại669

@pestilence, tôi muốn cho ai đó chọn một mục trong hộp chọn và khi tôi nhấp vào nút gửi, kết quả tìm kiếm sẽ được hiển thị trong bảng. Vì vậy, tại phần phụ trợ, khi tôi chọn mục này, giá trị của nó sẽ được chuyển đến một truy vấn mysql bằng php dưới dạng một biến. Đây là những gì tôi muốn làm. Nhưng có vẻ như tôi không thể tìm thấy giải pháp trong javascript. Bạn có chút manh mối nào không?
CN Jiangong

Có, đăng hoặc nhận phương thức trong biểu mẫu sẽ được chấp nhận nếu nó hoạt động.
CN Jiangong

2

Mã của bạn có một vài điều sai với nó.

  • Bạn xác định hàm JavaScript, func_load3 (), nhưng không gọi nó.
  • Chức năng của bạn được xác định ở vị trí sai. Khi nó được xác định trong trang của bạn, các đối tượng HTML mà nó đề cập đến chưa được tải. Hầu hết mã JavaScript kiểm tra xem tài liệu đã được tải đầy đủ trước khi thực hiện chưa, hoặc bạn chỉ có thể di chuyển mã của mình qua các yếu tố mà nó đề cập đến trong trang.
  • Mẫu của bạn không có cách nào để gửi nó. Nó cần một nút gửi.
  • Bạn không kiểm tra xem mẫu của bạn đã được gửi chưa.

Có thể đặt biến JavaScript trong một biến ẩn trong một biểu mẫu, sau đó gửi nó và đọc lại giá trị trong PHP. Đây là một ví dụ đơn giản cho thấy điều này:

<?php
if (isset($_POST['hidden1'])) {
   echo "You submitted {$_POST['hidden1']}";
   die;
}

echo <<<HTML
   <form name="myform" action="{$_SERVER['PHP_SELF']}" method="post" id="myform">
      <input type="submit" name="submit" value="Test this mess!" />
      <input type="hidden" name="hidden1" id="hidden1" />
   </form>

   <script type="text/javascript">
      document.getElementById("hidden1").value = "This is an example";
   </script>
HTML;
?>

2

khi trang của bạn tải mã PHP lần đầu tiên chạy và thiết lập bố cục hoàn chỉnh của trang web của bạn. sau khi bố trí trang, nó thiết lập tải JavaScript lên. bây giờ JavaScript tương tác trực tiếp với DOM và có thể thao tác bố cục nhưng PHP không thể cần làm mới trang. Có một cách duy nhất là làm mới trang của bạn và truyền các tham số trong URL trang để bạn có thể lấy dữ liệu qua PHP. Vì vậy, chúng tôi sử dụng AJAX để tương tác Javascript với PHP mà không cần tải lại trang. AJAX cũng có thể được sử dụng làm API. một điều nữa nếu bạn đã khai báo biến trong PHP. trước khi tải trang thì bạn có thể sử dụng nó với ví dụ Javascript của bạn.

<script>
var username = "<?php echo $myname;?>";
alert(username);
</script>

đoạn mã trên là chính xác và nó sẽ hoạt động. nhưng mã dưới đây là hoàn toàn sai và nó sẽ không bao giờ hoạt động.

<script>
    var username = "syed ali";
    var <?php $myname;?> = username;
    alert(myname);
    </script>
  • Truyền giá trị từ JavaScript sang PHP thông qua AJAX

    đó là cách an toàn nhất để làm điều đó bởi vì nội dung HTML có thể được chỉnh sửa thông qua các công cụ dành cho nhà phát triển và người dùng có thể thao tác dữ liệu. Vì vậy, tốt hơn là sử dụng AJAX nếu bạn muốn bảo mật cho biến đó. Nếu bạn là người mới sử dụng AJAX, vui lòng tìm hiểu AJAX rất đơn giản.

Cách tốt nhất và an toàn nhất để truyền biến JavaScript vào PHP là thông qua AJAX

ví dụ AJAX đơn giản

var mydata = 55;
var myname = "syed ali";
var userdata = {'id':mydata,'name':myname};
    $.ajax({
            type: "POST",
            url: "YOUR PHP URL HERE",
            data:userdata, 
            success: function(data){
                console.log(data);
            }
            });
  • Giá trị PASS từ javascript đến php thông qua các trường ẩn.

nếu không, bạn có thể tạo đầu vào HTML ẩn bên trong biểu mẫu của mình. giống

<input type="hidden" id="mydata">

sau đó thông qua jQuery hoặc javaScript chuyển giá trị vào trường ẩn. giống

<script>
var myvalue = 55;
$("#mydata").val(myvalue);
</script>

Bây giờ khi bạn gửi biểu mẫu, bạn có thể nhận được giá trị trong PHP.


1
Cảm ơn bạn. Rất hữu ích. Phương thức jQuery không cho phép bạn truyền dữ liệu được tạo khi trang chạy? Bạn không thể đặt trường nhập thành giá trị & chọn nó bằng php? Đây là một trong những ví dụ Ajax rõ ràng nhất mà tôi đã thấy. Tôi đang mong chờ để thử nó.
lọn tóc

1

Có thể bạn có thể sử dụng phương thức jquery serialize () để mọi thứ sẽ diễn ra ngay lập tức.

var data=$('#myForm').serialize();

// bằng cách này bạn cũng có thể nhận được giá trị ẩn ở phía máy chủ.


0

Giải pháp này rõ ràng không được đề cập trước đó. Bạn cũng có thể sử dụng cookie để truyền dữ liệu từ trình duyệt trở lại máy chủ.

Chỉ cần đặt cookie với dữ liệu bạn muốn chuyển sang PHP bằng javascript trong trình duyệt.

Sau đó, chỉ cần đọc cookie này về phía PHP.


. . . Bạn có muốn đưa ra một ví dụ và có thể một hoặc hai liên kết có liên quan? (Xem Cách trả lời .)
ashleedawg

0

Chúng ta không thể chuyển trực tiếp các giá trị biến JavaScript sang mã PHP ... Mã PHP chạy ở phía máy chủ và nó không biết gì về những gì đang diễn ra ở phía máy khách.

Vì vậy, tốt hơn là sử dụng AJAX để phân tích giá trị JavaScript thành Mã php.

Hoặc cách khác, chúng ta có thể thực hiện việc này với sự trợ giúp của COOKIES trong mã của chúng tôi.

Cảm ơn & chúc mừng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.