• Visitors can check out the Forum FAQ by clicking this link. You have to register before you can post: click the REGISTER link above to proceed. To start viewing messages, select the forum that you want to visit from the selection below. View our Forum Privacy Policy.
  • FREE workshop: Preparing contractors for Autumn : Weds 29th Sep at 7.15pm. More details here.

PHP MySQL problem

Collapse
X
  •  
  • Filter
  • Time
  • Show
Clear All
new posts

    PHP MySQL problem

    Got a hidden iframe in a webpage that invokes a PHP script:

    <iframe id="offers" src="captcha/getoffers.php" etc

    The php populates the iframe with a list of current (ie where expiry date is >= current date) offer codes when the page is opened and it works fine. However, I am also trying to update the table with any expired statuses:

    if expired etc....
    $id = mysql_result($result,$i,"id");
    $r = mysql_query("UPDATE offers SET status=-1 WHERE id=$id");

    That works when I refresh the page but not when I open it, although echo statements show it is going through the loop on open, so can't see why the query line is not working. Any great ideas? Cheers.
    bloggoth

    If everything isn't black and white, I say, 'Why the hell not?'
    John Wayne (My guru, not to be confused with my beloved prophet Jeremy Clarkson)

    #2
    Possibly a document ready issue. Try putting this script somewhere on your page:

    Code:
        <script type="text/javascript">
            setTimeout('setHiddenIFrameSource();', 1000);
    
            function setHiddenIFrameSource() { 
                document.getElementById('offers').src = "captcha/getoffers.php";
            }
        </script>

    Comment


      #3
      Cheers Gentile. Will give that a go.

      Update. Yeh that works, although really not sure why. I could understand if it wasn't running the PHP but it was. In fact, if I make a pure PHP page to update one record it only works on refresh although the page wouldn't show if the PHP wasn't running!

      Wierd, anyway it works, ta very much.
      Last edited by xoggoth; 8 October 2012, 09:55.
      bloggoth

      If everything isn't black and white, I say, 'Why the hell not?'
      John Wayne (My guru, not to be confused with my beloved prophet Jeremy Clarkson)

      Comment


        #4
        Originally posted by xoggoth View Post
        Cheers Gentile. Will give that a go.

        Update. Yeh that works, although really not sure why. I could understand if it wasn't running the PHP but it was. In fact, if I make a pure PHP page to update one record it only works on refresh although the page wouldn't show if the PHP wasn't running!

        Wierd, anyway it works, ta very much.
        You're welcome.

        Last thing, though, the above solution works because a race condition exists whereby the source of your iFrame is set before the document that contains it is ready. The code above alleviates that race condition in a naive way, by inserting a second's delay into proceedings to allow the document to finish loading before setting the source of the IFrame that is a constituent part of the document. There's no guarantee that precise delay will work for every user, though. Still, it at least identifies what the problem was.

        Now that you know for sure what problem is, the best solution to ensure that this works for all users, if you're using jQuery, is to put the following code on your page:

        Code:
            <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js" type="text/javascript"></script>
            <script type="text/javascript">
                    $(document).ready(function () { $('#offers').attr("src", "captcha/getoffers.php"); });        
            </script>
        That'll make sure the source for your iFrame is set only when the document is ready, and not before, however long it takes for the document to get ready on a given machine. If for any reason you don't want to use jQuery, a less-preferred solution would be to call the setHiddenIFrameSource() function from the body onload event, and that should have the same effect. You can do that by changing the <body> tag so that it resembles the following snippet:

        Code:
        <body onload="setHiddenIFrameSource();">
        and making sure that the JavaScript with the definition of the setHiddenIFrameSource function appears as before in the <head> section of your page.

        Comment


          #5
          More great stuff. Thanks. Think it's all working now but repeating table update by date in CC callback just to be sure.
          bloggoth

          If everything isn't black and white, I say, 'Why the hell not?'
          John Wayne (My guru, not to be confused with my beloved prophet Jeremy Clarkson)

          Comment

          Working...
          X