$ _POST пуст при использовании AJAX (Prototype) - PullRequest
0 голосов
/ 25 октября 2010

Я довольно новичок в PHP, и у меня возникла проблема, на которую я нигде не могу найти ответ !! Это действительно беспокоит меня ... Я хочу опубликовать данные в сценарии PHP, используя AJAX. Я использую прототип JS Framework для связи AJAX.

Вот код JS:

new Ajax.Request("/ondemand/Radio.php", {
          method: 'POST',
          parameters: {programID: id}, 
          onSuccess: function(transport) {
                window.alert("Success, " + id);


          },
          onFailure: function() {
              window.alert("Communication problem");
          },
          onComplete: function() {
              window.alert("Complete");
          }
});

Все JS находятся в элементе ... Функция вызывается при выборе опции из поля

PHP код:

<?php 
       //Selects all programs that have a podcast
       $QUERY_SELECT_ALL_PROGRAMS   = "SELECT DISTINCT d.defnr, d.name 
                       FROM definition d, podcast p 
                   WHERE p.program = d.defnr";
       //Select podcasts that belongs to a given program
       $QUERY_SELECT_PODCASTS_FOR_PROGRAM   = "SELECT p.title, p.refnr, p.filename
                           FROM podcast p
                       WHERE program =  ?";
       //Selects all podcasts
       $QUERY_SELECT_ALL_PODCASTS = "SELECT p.refnr, p.title, p.filename, p.filename 
                            FROM podcast";

        $BROADCAST_PATH = "";

        $programID = $_POST["programID"];


/* Returns true if DB connection to server and database is OK
 * Takes mysqli as parameter
 * Connect to the database using the MySQLi API in PHP 5.x
 * This is the prefered way*/
 function DBconnection($connection) {
   $result = false;
   //Refering to $con declared eralier
   //global $connection;
   //Check DB connection
 if ($connection->connect_error) { 
           die('Connect Error: '.$connection- >connect_error); }
else {
    //Refering to $DB_NAME declared earlier
    //Select DB
      global $DB_NAME;
       $DB_selected = $connection->select_db($DB_NAME);
      if (!$DB_selected) { die ('Can\'t use : ' . $connection->connect_error); }
       else { $result = true; }
  }
  return $result;
   }

   ?>


<?php
  echo "<form>";
  echo "<select>";
  //The MySQL connection object, must be created before connection
  $con = new mysqli($MYSQL_SERVER, $MYSQL_USER_NAME, $MYSQL_PASSWORD, $DB_NAME);
if (DBconnection($con)) {
    if ($stmt = $con->prepare($QUERY_SELECT_PODCASTS_FOR_PROGRAM)) {
        $stmt->bind_param("i", $program);
        //$stmt->bind_param("i", $program);
        //$program = $_POST["programs"];
        $program = $_POST["programID"];
        $stmt->execute();
        $stmt->bind_result($title, $refnr, $filepath);
    }
    if (is_null($_POST["programs"])) {
        echo "<option>Choose a program first...</option>";
        //echo "<option>".$file."</option>";
    }
    else {
        if (is_numeric($_POST["programs"])) {
            while($stmt->fetch()) {
                print_r($title);
                //$filepath holds the value of only the name of the broadcast without the entire path
                //40 is the starposition of the name
                $filename = substr($filepath, 40);
                echo "<option value=\"".$refnr."\" id=\"".$refnr."\" onclick=\"play('".$filename."')\">".utf8_encode($title).utf8_encode($filename)."</option>";
            }
        }
    }
     $con->close();
}
echo "</select>";
echo "</form>"; 
  ?>

Вот моя проблема ... Значение $ _POST всегда равно "Array ()". При использовании обычной формы, которая публикует сообщения, все в порядке, я получаю значение, но при использовании AJAX (не только Prototype) я не могу.

То, что я хочу сделать, попросту говоря: разместить данные с помощью AJAX -> использовать полученные данные в SQL-запросе -> создать HTML-элемент, основанный на результате из sql wuery ..

Это довольно сложно, когда я не получаю переменную POST'а

Я также взял локк при отправке, и POSTDATA был верным. Пожалуйста, мне действительно нужна помощь кого-то в этом вопросе ... я уже несколько дней ищу ответ ..

Прочтите этот пост, чтобы лучше понять .. Та же проблема

Ответы [ 5 ]

0 голосов
/ 30 ноября 2010

Если вы публикуете данные напрямую, а результат - именно то, что вы ожидаете, то источником проблемы является сгенерированный HTML.Эта строка:

 echo "<option value=\"".$refnr."\" id=\"".$refnr."\" onclick=\"play('".$filename."')\">".utf8_encode($title).utf8_encode($filename)."</option>";

является причиной вашей проблемы."Array()" является разновидностью "toString ()" того, что делает PHP, когда массивы объединяются в строку.$refnr, очевидно, здесь массив, и Prototype просто выбирает это значение.

Подсказка: используйте printf('<option value="%d">%s</option>', ...), чтобы спасти глаза от синдрома наклонной косой черты;

0 голосов
/ 28 октября 2010

Возможно, это ошибка и отправка запроса в GET?Попробуйте:

print_r($_REQUEST);

Переменная $ _REQUEST будет содержать как переменные $ _POST, так и $ _GET.

Мне бы тоже было трудно поверить, но возможно ли, что вместо method: 'POST'вы должны использовать method: 'post' - большинство примеров прототипов используют строчные буквы.

0 голосов
/ 25 октября 2010

не знаю, как комментировать, поэтому я должен опубликовать это как ответ.Если этот код скопирован из вашего php-скрипта:

$var = $_POST["programID"];
<p id="p">
<?php 
    echo "Program ID er " . utf8_encode($var);
?>
</p>

Разве вы не пропустили <?php and ?> вокруг $var = $_POST["programID"];

Отредактировано 20101028:

Хорошо, у меня былоПосмотрите на ваш недавно опубликованный код и пока не можете найти ничего очевидного, я внес в него некоторые изменения:

 <?php

 $message = "<div id=\"php_debug\";
  style=\"border:1px solid red;
          background-color: black;
          color: white;\"
  >";// this is the debug message we will build and later print out where we need it

 //Selects all programs that have a podcast
 $QUERY_SELECT_ALL_PROGRAMS   = "SELECT DISTINCT d.defnr, d.name 
   FROM definition d, podcast p 
   WHERE p.program = d.defnr";
 //Select podcasts that belongs to a given program
 $QUERY_SELECT_PODCASTS_FOR_PROGRAM   = "SELECT p.title, p.refnr, p.filename
   FROM podcast p
   WHERE program =  ?";
 //Selects all podcasts
 $QUERY_SELECT_ALL_PODCASTS = "SELECT p.refnr, p.title, p.filename, p.filename 
   FROM podcast";

 $BROADCAST_PATH = "";
 $message .= "\$_POST["programID"] = ".$_POST["programID"]."<hr />";

 $programID = $_POST["programID"];
 $message .= "\$programID = ".$programID."<hr />";

 /* Returns true if DB connection to server and database is OK
 * Takes mysqli as parameter
 * Connect to the database using the MySQLi API in PHP 5.x
 * This is the prefered way*/
 function DBconnection($connection) {
   $message .= "I am in DBconnection($connection)<hr />";
   $result = false;
   //Refering to $con declared eralier
   //global $connection;
   //Check DB connection

   if ($connection->connect_error) { 
           die('Connect Error: '.$connection- >connect_error); }
   else{
     //Refering to $DB_NAME declared earlier
     //Select DB
     global $DB_NAME;
     $DB_selected = $connection->select_db($DB_NAME);
     if (!$DB_selected) { die ('Can\'t use : ' . $connection->connect_error); }
     else{ $result = true; }
   }
   return $result;
 }

 // Start generating form
 echo "<form>";
 echo "<select>";
 //The MySQL connection object, must be created before connection
 $con = new mysqli($MYSQL_SERVER, $MYSQL_USER_NAME, $MYSQL_PASSWORD, $DB_NAME);
 if (DBconnection($con)) {
   if ($stmt = $con->prepare($QUERY_SELECT_PODCASTS_FOR_PROGRAM)) {
   $message .= "\$program = ".$program."(\$program has never been seen before in this script)<hr />";
     //$stmt->bind_param("i", $program); This line was here originally, $program is null, has never been initialized before, $programID is the var where you store $_POST data, so I changed it to below
     $stmt->bind_param("i", $programID);
     $program = $_POST["programID"];//I left this here, becaause I dont know what you use $program for
     $message .= "\$program = ".$program."(\$program has been filled with \$_POST["programID"])<hr />";

     $stmt->execute();
     $stmt->bind_result($title, $refnr, $filepath);
   }
   $message .= "\$_POST["programs"] = ".$_POST["programs"]."(\$_POST["programs"] has never been sen before)<hr />";
   if(is_null($_POST["programs"])) {
   $message .= "\$_POST["programs"] was empty so I generated \"Choose program first...\" option"<hr />";
     echo "<option>Choose a program first...</option>";
     //echo "<option>".$file."</option>";
   }elseif(is_numeric($_POST["programs"])){
   $message .= "\$_POST["programs"] was numeric so I will start a loop here:<br /> START OF LOOP <br />";
     while($stmt->fetch()) {
       print_r($title);
       //$filepath holds the value of only the name of the broadcast without the entire path
       //40 is the starposition of the name
       $filename = substr($filepath, 40);
       $message .= "\$title = ".$title." and \$filename = ".$filename."<br />";
       echo "<option value=\"".$refnr."\" id=\"".$refnr."\" onclick=\"play('".$filename."')\">".utf8_encode($title).utf8_encode($filename)."</option>";
     }
   $message .= "END OF LOOP<hr />";
   }
   $con->close();
 }
 echo "</select>";
 echo "</form>";
 $message .= "</ div>";
 echo($message);//print out the debug message we were building through out the script 
 ?>

Не могли бы вы использовать вышеприведенный код и сообщить нам, что он распечатывает?

Также я бы посоветовал вам обработать все почтовые данные в начале скрипта, выполнив что-то вроде этого:

$var1 = $_POST["var1"];
$var2 = $_POST["var2"];
$var3 = $_POST["var3"];
$var4 = $_POST["var4"];
$var5 = $_POST["var5"];

Потому что таким образом вы избавите себя от путаницы, позже и только работайтес простыми для чтения именами переменных.Например, что такое $ _POST ["программы"]?это то же самое, что $ _POST ["programID"]?

В целом существует много путаницы, по крайней мере для меня с именами переменных:

$program
$programID
$programs
$_POST["program"]
$_POST["programs"]
$_POST["programID"]

Какие из них используются?Какие из них правильные?

Я стремлюсь решить эту проблему, начиная имя переменной с ее назначением:

$ id_program -> ID одной программы или строки в db $ txt_program ->описание программы или программы txt $ num_programs -> количество программ, количество программ (сколько идентификаторов) $ arr_programs -> массив программ, например массив всех идентификаторов программ

Надеюсь, это помоглонемного, дайте мне знать.Удачи:)

0 голосов
/ 25 октября 2010

Я мог бы что-то здесь упустить, но что вы на самом деле пытаетесь сделать?Ajax.Request по умолчанию ничего не возвращает.Можно использовать responseText для обновления вашей страницы, но ваш код не ссылается на это.Глядя на ваш код, вы не увидите ничего обновленного на своей странице (если это то, что вы ожидаете), но вы должны получать предупреждение JavaScript от вашего onSuccess обратного вызова.Если нет, пожалуйста, подтвердите, какой обратный вызов (или, если нет, какую ошибку) вы получаете.

Если вы хотите обновить значение на своей странице с помощью AJAX, вам нужно взглянуть на Ajax.Updater.Для ясности, если вы хотите обновить идентификатор «p» с помощью вывода вашего вызова Ajax, вы должны сделать:

new Ajax.Updater('p', '/ondemand/Radio.php', {
  parameters: { programID: id }
});
0 голосов
/ 25 октября 2010

Я не знаю, правильно ли вы вставили свой код в свой вопрос, но $var = $_POST["programID"]; не отображается в блоке PHP, поэтому $ var не будет присвоено значение из массива POST ...

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