Передать переменную из цикла в функцию - PullRequest
1 голос
/ 12 марта 2019

Я работаю с Php менее 2 месяцев (это также мой первый вопрос, поэтому, пожалуйста, скажите мне, если я что-то упустил), и все прошло гладко вплоть до сегодняшнего дня. Я работаю над плагином форм для Wordpress и в настоящее время реализую код, чтобы формы сохранялись в базе данных для соединения с шорткодом, включающим идентификатор формы в базе данных. Первая форма имеет идентификатор 1, а шорткод IForm_1. Довольно просто.

Проблема возникает при зацикливании всех форм и невозможности передать значение $ ID из цикла в функцию IForm.

 $ID= 0;
 $FormID= 0;
 settype($ID, "integer");

   for ($x = 1; $x <= 300; $x++) {
        global $ID;
        $ID++;
        $ShortCode = "IForm_";
        $ShortCode .= $ID;
        $FormID = $ID;
       add_shortcode( $ShortCode, 'IForm_Array' );
        $ShortCode ='';
}

Вот цикл, который очень прост, когда $ ShortCode совпадает с шорткодом, используемым на сайте, который он работает, и IForm используется как надо.

function IForm(){
    global $ID;
    //testing_decode();
    // Gets the value of baseTest from getDB and puts it in test.
    $DBForm = getDB($ID);
    $Form = $DBForm;
    $Form .=  "Works but not really";
    return $Form;

}

Вот функция.

Проблема в том, что $ ID всегда равен 300 в функции, которая является концом цикла. IForm выполняется, когда $ ID в цикле совпадает с коротким кодом на сайте / посте, который говорит мне, что значение $ ID действительно корректно для некоторой части цикла. Когда идентификатор действительно правильный, я хотел бы передать его в функцию IForm, чтобы использовать его для поиска правильной формы в базе данных (MySQL).

Теперь мой вопрос заключается в том, как передать (если это вообще возможно) значение $ ID в 3-м ряду цикла в 5-й ряд функции. В качестве альтернативы можно было бы принудительно разорвать цикл, когда он выстраивается в линию, и использовать последнее значение $ ID, которое будет передано в IForm.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

WordPress делает это немного сложнее, чем нужно, потому что вы не можете передать дополнительные параметры шорткоду (afaik).

Прежде чем мы начнем, давайте разберемся с 300. Цикл, в котором вы добавляете шорткоды, выполняется на ранней стадии загрузки страницы. Фактический вызов вашей функции шорткода на более позднем этапе. Тогда глобальная переменная $ ID будет иметь окончательное значение (в вашем случае 300)

Вот два способа решить эту проблему:

Во-первых, вы можете использовать замыкания и наследовать $ ID из родительской области:

   for ($x = 1; $x <= 300; $x++) {
    $ID++;
    $ShortCode = "IForm_";
    $ShortCode .= $ID;
    $FormID = $ID;
    add_shortcode( $ShortCode, function () use ($ID) {
      $DBForm = getDB($ID);
      $Form = $DBForm;
      $Form .=  "Works but not really";
      return $Form;
    } );
    $ShortCode ='';
}

Подробнее об этом вы можете прочитать в руководстве . Это также объясняет разницу между use и глобальными переменными.

Во-вторых, вы можете использовать атрибуты шорткода. Вы бы больше не использовали [Form_1], но [Form id=1]. Затем вы можете получить доступ к идентификатору в массиве, который Wordpress автоматически передает вашей функции.

function IForm($attr){
  $ID = intval($attr['id']); // A little sanitation, because $attr could come from a user with low privileges
  $DBForm = getDB($ID);
  $Form = $DBForm;
  $Form .=  "Works but not really";
  return $Form;
}

Небольшая документация по этому вопросу доступна здесь .

0 голосов
/ 12 марта 2019

Давайте посмотрим, что вы там сделали

$ID= 0;
// Define a variable called ID

   for ($x = 1; $x <= 300; $x++) {
        global $ID;
        // get access to global variable id
        $ID++;
        // increment local or global counter, undefined behaviour 

Вместо этого я рекомендую сделать

global $ID;

for ($x = 1; $x <= 300; $x++) {
  $ID++;
  // Do what you think you have to do

не передавайте переменные над глобальными переменными в функции, вместо этого используйте параметр

function IForm($id){
  //testing_decode();

  $DBForm = getDB($id);
  $Form = $DBForm;
  $Form .=  "Works very good";
  return $Form;
}

и вызовите функцию как

IForm(42); //or 
IForm($ID);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...