Неопределенная переменная в PHP - PullRequest
0 голосов
/ 11 октября 2010

Я работаю над отправкой XML-запроса на URL с помощью cURL в PHP.

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

Вот мой код:

$format = 'Y-m-j G:i:s'; 

$date = date ( $format );
$d = date ( $format, strtotime ( '-90 days' ) );

$sql = mysql_query("SELECT * FROM recurringPayments WHERE lastpmt <= '$d'");

$num_rows = mysql_num_rows($sql); 
echo $num_rows . " results found";

echo "<table style=\"border:1px solid green;\">
            <tr bgcolor=\"#bdd73b\">
            <th>ID</th>
            <th>Company Name</th>
            <th>Annual Subscription</th>
            <th>Package</th>
            <th>Cost</th>
            <th>Payer Ref</th>
            <th>Payment Ref</th>
            <th>Last Payment Date</th>
            </tr>";

            while ($row = mysql_fetch_array($sql))
            {
                echo "<tr>";
                echo "<td>" . $row['ID'] . "</td>";
                echo "<td>" . $row['compName'] . "</td>";
                echo "<td>" . $row['annualSub'] . "</td>";
                echo "<td>" . $row['package'] . "</td>";
                echo "<td>" . $row['cost'] . "</td>";               
                echo "<td>" . $row['payerref'] . "</td>";
                echo "<td>" . $row['pmtref'] . "</td>";
                echo "<td>" . $row['lastpmt'] . "</td>";
            }
            echo "</table>";        
while ($row = mysql_fetch_array($sql))
{
$xml_data ='<request type="receipt-in" timestamp="20030520151742">'.
       '<merchantid>test</merchantid>'.
           '<account>internet</account>'.
       '<orderid>transaction01</orderid>'.
       '<amount currency="EUR">'.$row['cost'].'</amount>'.
           '<payerref>'.$row['payerref'].'</payerref>'.
           '<paymentmethod>'.$row['pmtref'].'</paymentmethod>'.
           '<autosettle flag="1" />'.
           '<md5hash />'.
       '<sha1hash>c81377ac77b6c0a8ca4152e00cc173d01c3d98eb</sha1hash'.  
       '</request>';
}

 echo $xml_data;

Когда я пытаюсь отобразить $ xml_data, яполучить следующее сообщение об ошибке:

Примечание: неопределенная переменная: xml_data в C: \ wamp \ www \ Internal \ paymentDue.php в строке 63

Это была моя логикачто я смогу вывести XML при выводе таблицы, однако я могу (вероятно, ошибаться).Любое руководство приветствуется.

Спасибо.

PS:

Я также просто осознаю, когда я публикую это, что если я использую цикл while в текущем контексте,$ xml_data будет перезаписываться при каждом цикле.Любая помощь в этом тоже будет отличной.

Ответы [ 5 ]

4 голосов
/ 11 октября 2010

Вы перебираете свой набор результатов от первого до последнего, чтобы построить html-таблицу, затем пытаетесь повторить его снова для своего xml, даже если вы уже прошли конец набора. Постройте оба в одном цикле.

Установите xml_data равным '' перед циклом, затем используйте xml_data. = Для его создания (или даже используйте SimpleXML или XMLWriter вместо создания его в виде строки)

2 голосов
/ 11 октября 2010

Попробуйте это:

   <?php

    $format = 'Y-m-j G:i:s'; 

    $date = date ( $format );
    $d = date ( $format, strtotime ( '-90 days' ) );

    $sql = mysql_query("SELECT * FROM recurringPayments WHERE lastpmt <= '$d'");

    $num_rows = mysql_num_rows($sql); 
    echo $num_rows . " results found";

    $xml_data = "";

    echo "<table style=\"border:1px solid green;\">
                <tr bgcolor=\"#bdd73b\">
                <th>ID</th>
                <th>Company Name</th>
                <th>Annual Subscription</th>
                <th>Package</th>
                <th>Cost</th>
                <th>Payer Ref</th>
                <th>Payment Ref</th>
                <th>Last Payment Date</th>
                </tr>";

                while ($row = mysql_fetch_array($sql))
                {
                    echo "<tr>";
                    echo "<td>" . $row['ID'] . "</td>";
                    echo "<td>" . $row['compName'] . "</td>";
                    echo "<td>" . $row['annualSub'] . "</td>";
                    echo "<td>" . $row['package'] . "</td>";
                    echo "<td>" . $row['cost'] . "</td>";               
                    echo "<td>" . $row['payerref'] . "</td>";
                    echo "<td>" . $row['pmtref'] . "</td>";
                    echo "<td>" . $row['lastpmt'] . "</td>";

                    $xml_data .='<request type="receipt-in" timestamp="20030520151742">'.
                           '<merchantid>test</merchantid>'.
                               '<account>internet</account>'.
                           '<orderid>transaction01</orderid>'.
                           '<amount currency="EUR">'.$row['cost'].'</amount>'.
                               '<payerref>'.$row['payerref'].'</payerref>'.
                               '<paymentmethod>'.$row['pmtref'].'</paymentmethod>'.
                               '<autosettle flag="1" />'.
                               '<md5hash />'.
                           '<sha1hash>c81377ac77b6c0a8ca4152e00cc173d01c3d98eb</sha1hash'.  
                           '</request>';


                }
                echo "</table>";        


     echo $xml_data;

Нет смысла в цикле дважды, и цикл заставляет курсор двигаться до конца.Это должно создать вашу переменную xml_data во время начального цикла.Также обратите внимание, что я объявил $ xml_data как пустую строку вне цикла, и каждый раз, когда мы выполняем цикл, я просто добавляю строку, используя. =

1 голос
/ 11 октября 2010

ваш второй цикл проходит через mysql_query, который уже был зациклен, поэтому указатель цикла находится в конце, что означает, что этот код никогда не будет запущен. Так как он не был запущен, $ xml_data не установлен, и когда вы попытаетесь повторить его в конце, вы получите уведомление.

while ($row = mysql_fetch_array($sql))
{
$xml_data ='<request type="receipt-in" timestamp="20030520151742">'.
       '<merchantid>test</merchantid>'.
           '<account>internet</account>'.
       '<orderid>transaction01</orderid>'.
       '<amount currency="EUR">'.$row['cost'].'</amount>'.
           '<payerref>'.$row['payerref'].'</payerref>'.
           '<paymentmethod>'.$row['pmtref'].'</paymentmethod>'.
           '<autosettle flag="1" />'.
           '<md5hash />'.
       '<sha1hash>c81377ac77b6c0a8ca4152e00cc173d01c3d98eb</sha1hash'.  
       '</request>';
}

Попробуйте добавить

mysql_data_seek($sql, 0);

перед вашим вторым циклом while

0 голосов
/ 11 октября 2010
$format = 'Y-m-j G:i:s'; 

$date = date ( $format );
$d = date ( $format, strtotime ( '-90 days' ) );

$sql = mysql_query("SELECT * FROM recurringPayments WHERE lastpmt <= '$d'");

$num_rows = mysql_num_rows($sql); 
echo $num_rows . " results found";

$xml_data = ''; // init empty

echo "<table style=\"border:1px solid green;\">
            <tr bgcolor=\"#bdd73b\">
            <th>ID</th>
            <th>Company Name</th>
            <th>Annual Subscription</th>
            <th>Package</th>
            <th>Cost</th>
            <th>Payer Ref</th>
            <th>Payment Ref</th>
            <th>Last Payment Date</th>
            </tr>";

while ($row = mysql_fetch_array($sql))
{
   echo "<tr>";
   echo "<td>" . $row['ID'] . "</td>";
   echo "<td>" . $row['compName'] . "</td>";
   echo "<td>" . $row['annualSub'] . "</td>";
   echo "<td>" . $row['package'] . "</td>";
   echo "<td>" . $row['cost'] . "</td>";               
   echo "<td>" . $row['payerref'] . "</td>";
   echo "<td>" . $row['pmtref'] . "</td>";
   echo "<td>" . $row['lastpmt'] . "</td>";

   $xml_data .='<request type="receipt-in" timestamp="20030520151742">'.
                       '<merchantid>test</merchantid>'.
                           '<account>internet</account>'.
                       '<orderid>transaction01</orderid>'.
                       '<amount currency="EUR">'.$row['cost'].'</amount>'.
                           '<payerref>'.$row['payerref'].'</payerref>'.
                           '<paymentmethod>'.$row['pmtref'].'</paymentmethod>'.
                           '<autosettle flag="1" />'.
                           '<md5hash />'.
                       '<sha1hash>c81377ac77b6c0a8ca4152e00cc173d01c3d98eb</sha1hash'.  
                       '</request>';

}
echo "</table>";        

echo $xml_data;
0 голосов
/ 11 октября 2010

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

Для последнего попробуйте следующее:

$xmlData = '';
while ($row = mysql_fetch_array($sql))
{
    echo "<tr>";
    echo "<td>" . $row['ID'] . "</td>";
    echo "<td>" . $row['compName'] . "</td>";
    echo "<td>" . $row['annualSub'] . "</td>";
    echo "<td>" . $row['package'] . "</td>";
    echo "<td>" . $row['cost'] . "</td>";               
    echo "<td>" . $row['payerref'] . "</td>";
    echo "<td>" . $row['pmtref'] . "</td>";
    echo "<td>" . $row['lastpmt'] . "</td>";

    $xmlData .= '<request type="receipt-in" timestamp="20030520151742">'.
   '<merchantid>test</merchantid>'.
       '<account>internet</account>'.
   '<orderid>transaction01</orderid>'.
   '<amount currency="EUR">'.$row['cost'].'</amount>'.
       '<payerref>'.$row['payerref'].'</payerref>'.
       '<paymentmethod>'.$row['pmtref'].'</paymentmethod>'.
       '<autosettle flag="1" />'.
       '<md5hash />'.
   '<sha1hash>c81377ac77b6c0a8ca4152e00cc173d01c3d98eb</sha1hash'.  
   '</request>';
}

echo "</table>";
...