Jump to content

Psycho

Moderators
  • Posts

    12,145
  • Joined

  • Last visited

  • Days Won

    127

Posts posted by Psycho

  1. 32 minutes ago, imgrooot said:

    That makes sense. I reversed the order and it seems to work fine now.

    Yes project_id is an auto-increment primary key field. I honestly never had issues with this method before so I kept using it. But I actually do have "date_created" with each record. So I can "ORDER BY date_created" if need be.

    Not so much about "need be" as it is you "should be". As I said, an auto-increment field will probably work in most situations, but if you have a date field you should absolutely be using that. It's about using good programming techniques. For example, how records are created/managed could change (especially in large projects with many developers). There could be logic that allows a record to be "replaced" with a new record that simply changes the existing record and sets a new "created date". Sorting by the ID would then have that record display out of sequence. And understand that is just an example, there could be any number of reasons why the sequence of the id would not be the creation order - either due to business rules or other bad practices.

  2. So, the 'absents' for a particular record (in your example 30) is the sum of all absents where the RecNo is less than or equal to 30?

    SELECT SUM(Absents)
    FROM [table_name]
    WHERE RecNo <= 30

    That will give you the total Absents for a single entry. But, if you want a query to return multiple records showing the Absents " . . . at each level of entry", I think the only solution is a sub-query - which would be very inefficient in this case (if ONLY doing in SQL). I would highly suggest querying for all the relevant records and calculating the Absents at each level in code.

  3. @kicken's answer is "correct", but I would highly advise against using such a general function. While that function is correctly using a prepared statement and protecting the $sid value, you cannot use prepared variables for table/column names. This leaves open the possibility for that function to open a potential exploit depending on how it is called. A function/method should be secure on its own without having to worry about how it is called. While prevailing logic is to write code once (i.e. don't build duplication functionality) when dealing with data it is typical to have explicit setter/getter functions/methods for scenarios such as this.

  4. To add some clarification, when there are multiple ORDER BY conditions, the query will order by the first condition. Then, if there are records with the same value in that first condition, then it will sort those records by the second condition. And so on through all conditions. I.e. the second (subsequent) condition(s) only apply when two records have the same value for the first (preceding) conditions.


    As @cyberRobot stated, your query will first sort all records by the project_id. Then, if any records have the same project_id (a scenarios I expect would never occur), then it would sort those records would be sorted by the featured value.

    I would also add that I assume project_id is an auto-increment primary key field. Using that for sorting by newest/oldest will "probably" work in most instances, but is a poor implementation. There are many scenarios where such a field would not necessarily be in order of when the records were created. I would suggest having a "date_created" field that is auto-populated when new records are created and using that for sorting by newest/oldest

  5. Heck, I'd still go with the original "simple" auto-increment field solution. All that really matters is that the numbers are unique for each raffle. What does it matter if the number are not sequential! E.g.

    Quote

    User | Raffle | Number
    Bob     1        1
    Bob     2        2
    Bob     2        3
    Dave    1        4
    Dave    3        5
    Dave    3        6
    Ed      1        7
    Ed      1        8

    Raffle #1 has four tickets sold with four unique numbers: 1, 4, 7, & 8.

  6. 4 hours ago, Adamhumbug said:

    Hi Psycho, you are correct this will be submitted.  I hadnt got around to sticking those in yet.

    Then you need to do that first. Your form, as it is, doesn't even have all the data you need. For example, you are outputting the fields associated with a date, but the "groups" of fields have nothing to indicate which date they are with. So, if the user submits you will have no way to know what date to use when inserting/updating the records. You should absolutely work on building a working process before adding the javascript. I foresee many other posts from you trying to work through what should be trivial issues if you just @Barand's code as-is without determining the naming/structure of the fields. Plus, since you are copying only a manager OR chef line (not the block), I think the AJAX call is unnecessary since all the data you need is within the DOM object.

    First, you need to determine how you will logically "group" fields and ensure each group has the necessary data. E.g. how do you know which name/start/end fields go together. You will also need a hidden field to identify the date in each group of fields. Plus, if you are dealing with the ability to edit existing records as well as add records, you need an identifier to know which groups of fields are associated with existing records. If done quickly without much thought the act of copying a row can become quite complicated. If done with some thought, it makes the job much easier.

    Below is a working example that does not use AJAX. Note that the "rec_id" field is to be populated with the ID when creating the page for the existing records. Entries added with the "Add" button will have an empty value. So, on the page that receives the form submission, you would use that data to determine whether to perform an UPDATE or INSERT.

    <html>
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
        <script>
        $( function() {
            $(".addRow").on( "click", function() {
                //alert('test');
                //Make reference to the parent row
                var parentRow =  $(this).closest('tr');
                //Create a copy of the parent row
                var newRow = parentRow.clone();
                //Remove values in the Cloned Time & ID fields
                $(newRow).find('input[name^="start_time"]').val('');
                $(newRow).find('input[name^="end_time"]').val('');
                $(newRow).find('input[name^="rec_id"]').val('');
                //Select the name based on parent record and disable
                $(newRow).find('select[name^="name"]').val($(parentRow).find('select[name^="name"]').val());
                $(newRow).find('select[name^="name"]').prop('disabled', true);
                //Remove the add button
                $(newRow).find('button').remove();
                newRow.insertAfter(parentRow);
                return false;
            })
        })
        
        </script>
    </head>
    <body>
        <form>
        <table id='staffOrderTable' class='table table-striped table-bordered mt-3 text-center'>
            <tr>
                <th class='table-dark' colspan='3'>Tuesday - 24th December 2019</th>
            </tr>
            <tr>
                <th class='' colspan='3'>Management    </th>
            </tr>
            <tr>
                <th class='col-4'>Name</th>
                <th class='col-4'>Start Time</th>
                <th class='col-4'>End Time</th>
            </tr>
            <tr>
                <td>
                    <input type='text' name='date[]' value='2019-12-24'>
                    <input type='text' name='rec_id[]' value='21'>
                    <select class='custom-select managerSelect' name="name[]">
                        <option value='5'>Manager A</option>
                        <option value='9'>Manager B</option>
                        <option value='2'>Manager C</option>
                    </select>
                </td>
                <td><input class='form-control' type='' name='start_time[]' value='6:00'></td>
                <td><input class='form-control' type='' name='end_time[]' value='14:00'></td>
                <td><button class='addRow'>Add Row</button></td>
            </tr>
            <tr>
                <th colspan='3'>Chefs</th>
            <tr/>
            <tr>
                <th class='col-4'>Name</th>
                <th class='col-4'>Start Time</th>
                <th class='col-4'>End Time</th>
            </tr>
            <tr>
                <td>
                    <input type='text' name='date[]' value='2019-12-24'>
                    <input type='text' name='rec_id[]' value='54'>
                    <select class='custom-select chefSelect' name="name[]">
                        <option value='8'>Chef A</option>
                        <option value='4'>Chef B</option>
                        <option value='7'>Chef C</option>
                    </select>
                </td>
                <td><input class='form-control' type='' name='start_time[]' value='7:00'></td>
                <td><input class='form-control' type='' name='end_time[]' value='12:00'></td>
                <td><button class='addRow'>Add Row</button></td>
            </tr>
            <tr>
                <th class='table-dark' colspan='3'>Tuesday - 24th December 2019</th>
            </tr>
            <tr>
                <th class='' colspan='3'>Management    </th>
            </tr>
            <tr>
                <th class='col-4'>Name</th>
                <th class='col-4'>Start Time</th>
                <th class='col-4'>End Time</th>
            </tr>
            <tr>
                <td>
                    <input type='text' name='date[]' value='2019-12-25'>
                    <input type='text' name='rec_id[]' value='33'>
                    <select class='custom-select managerSelect' name="name[]">
                        <option value='5'>Manager A</option>
                        <option value='9'>Manager B</option>
                        <option value='2'>Manager C</option>
                    </select>
                </td>
                <td><input class='form-control' type='' name='start_time[]' value='6:00'></td>
                <td><input class='form-control' type='' name='end_time[]' value='14:00'></td>
                <td><button class='addRow'>Add Row</button></td>
            </tr>
            <tr>
                <th colspan='3'>Chefs</th>
            <tr/>
            <tr>
                <th class='col-4'>Name</th>
                <th class='col-4'>Start Time</th>
                <th class='col-4'>End Time</th>
            </tr>
            <tr>
                <td>
                    <input type='text' name='date[]' value='2019-12-25'>
                    <input type='text' name='rec_id[]' value='74'>
                    <select class='custom-select chefSelect' name="name[]">
                        <option value='8'>Chef A</option>
                        <option value='4'>Chef B</option>
                        <option value='7'>Chef C</option>
                    </select>
                </td>
                <td><input class='form-control' type='' name='start_time[]' value='8:00'></td>
                <td><input class='form-control' type='' name='end_time[]' value='16:00'></td>
                <td><button class='addRow'>Add Row</button></td>
            </tr>
        </table>
        </form>
    </body>
    </html>

     

  7. You don't have to do this with JavaScript - although it would provide a better user experience. In fact, I think it is beneficial to build such functionality w/o JS to start and then add JS. But, I am unclear from your goal as to whether you are wanting to add management and chef rows independently or complete sections with both a management and chef line (or something else). Also, using a framework like JQuery is always a good idea.

    EDIT: I just noticed none of your input fields have names. Are you intending for the user to submit the form once filled out and do something with that data? I would assume so and in that case the naming of the fields is important if you are going to be dynamically adding fields.

  8. What you are calling duplicates are not, in fact, duplicates. I'm curious what made you think a UNION clause was needed?

    In the response to @Barand's query you showed a result set of five records each having a different gp_id value In other words, they are unique records. I can see that they contain much of the same data, but they are distinct records. What makes you consider them "duplicates"? I think your problem may stem from a schema problem. I see multiple things in what you are doing that don't make sense. For example, you are joining the user and updates tables using the name of the author? You would typically be joining tables based on IDs rather than arbitrary string values. Is the group_posts table for conversations between multiple individuals and are you adding a new record for each response in that conversation? What determines which records are form the same conversation?

  9. 3 hours ago, narutofan said:

    @Psycho thanks but your mysql suggestion didn't bring up a single post. i'm sorry for making it lengthy some ppl in the forum expect full code instead of shortened one's thats why i posted it so lengthy sorry again if it irritated or made you angry.

    My suggestion was just an example. It will work if implemented correctly. People want to see all the relevant code for a problem. It is incumbent upon the person with the problem to do the basic trouble shooting to determine the area of the code where the problem exists and provide that code. The person should also provide what the code is expected to do and what is IS doing differently than the expectation. I gave a potential explanation of why you would get duplicates if you are simply basing the additional records to get based on an index when ordered by date/time. When you are seeing duplicates - are there other records being added to the system that would be included in the user's feed? If so, that is likely why you are seeing duplicates. Here is an illustrative example:

    Let's say there are 6 records added from A - I. When you retrieve the first five records in reverse chronological order using LIMIT 0, 5  (which gets five records starting at index 0, i.e. 0 - 4) you will get I-E, because the query will see something like this (number in parenthesis represent the index of the records matching the criteria).

    Quote

    I (0)
    H (1)
    G (2)
    F (3)
    E (4)

    D (5)
    C (6)
    B (7)
    A (8)

    Now, let's say a new record is added (J) THEN you attempt to get the next five records using LIMIT 5, 5 (i.e. indexes 5-9). You will get a duplicate of record E, because it will have moved from index 4 to 5.

    Quote

    J (0)
    I (1)
    H (2)
    G (3)
    F (4)
    E (5)
    D (6)
    C (7)
    B (8)
    A (9)

    Based on your function totalUpdates() that returns five records based on an arbitrary $load variable to indicate the limit start index. I can't say that IS your problem, but it will be a problem if records are being added in-between the load calls. In any event, I suggest you add some logging to see what is going on. I would start by logging the calls to the totalupdates() function to verify that the $load value is what you expect (0, 5, 10, 15, etc.). I would also log the total number of records that match the conditions of the query (w/o the limit condition). That requires adding a second copy of the query with a count() instead of returning the results, but it would only be used for debugging purposes.

  10. I doubt anyone is going to try to read through and comprehend all of that code to try and deduce why you are having a problem. YOU need to do some debugging to narrow down the problem and then you are likely to get some responses.

     

    I'm certainly not going to read through all that and try to figure out what the code is doing in and where your problem may be, but one thing that jumps out at me is the query you are using and the use of LIMIT with a start index. I don't know if you have people actively using the application while you are seeing duplicates, but the use of a start index will not work if new posts are being created. Let's say you grab the first five records (indexes 0-4), then before you grab the next five records, someone adds another record. When you go to get records based on a start index of 5, the record that was index of 4 on your first query will now be an index of 5 and cause a duplicate to be displayed.

    I would suggest passing the ID or timestamp of the last record that was previously obtained. Then fashion your query something like this

    SELECT ....
    
    FROM ...
    
    WHERE ...
    
      AND date_created < (SELECT date_created FROM ... WHERE id = [id of last record])
    
    LIMIT 5

     

  11. As @Barand has stated, without knowing what $update_id1 contains and it's exact structure, it is impossible to know what the problem is, but I have a couple of comments

    1. Your original post contained this

    $update_id1=Array ( [0] => 398 [1] => 397 [2] => 393 [3] => 391 [8] => );
    
    //$i=0;
    foreach ($update_id1 as $i => $v) {
    
        $ex= explode(",", $v);
        $unique=array_unique($ex);
    
        //f$ketch username from update table in db and inject it to the feed query.
        $imp_id= implode(',', $ids);
        //$id1=$ids[$i];
        // $x=0;
        // for($x=0;$x<count(unique);$x++){ 
        echo 'ids:- '.$i; print_r($unique[$i]); echo '<br>';
    }

    Assuming there was a "real" array defined, within the foreach() loop the code first does an explode on the value - even though your example values have no commas for the explode. Then you store the unique values in a new variable called $unique. Then you do an implode of an array called $ids - which has never been defined. I think you meant to do an implode of the unique values ???

    2. While this line may work

    $r["friend_one"] == $_SESSION['uname'] ? $friends[]= $r["friend_two"] : $friends[] = $r["friend_one"];

     . . . it is an awkward implementation. This is much more precise and readable.

    $friends[] = ($r["friend_one"] == $_SESSION['uname']) ? $r["friend_two"] : $r["friend_one"];

    But, I'm betting there is a better way to determine the value within your query.

  12. This error is self explanatory

    Warning: getimagesize() expects parameter 1 to be string, resource given in

    When you call the function getimagesize() you are providing the variable $oriented_image. That variable is the result of the function getOrientedImage().

    $source_file = $_FILES["fileToUpload"]["tmp_name"];
    $oriented_image = getOrientedImage($source_file);

    You are passing a string value that represents the path to the image. But, the result of that image is an image resource. You need to provide the image path to the image in the function getimagesize(). You should modify the getOrientedImage() function to overwrite the original image with the rotated image. Then you can use the same imapge name/path in the getimagesize() function.

    For this error

    Warning: rename(XfdpPCBxns.jpg,../members/images/7/projects/8/): The system cannot find the file specified. (code: 2) in

    The function takes two parameters : the original name of the file and the new name - in that order. You are providing the new name as the first parameter and the new path as the 2nd parameter. How is the function supposed to know "which" file you want to rename?

    if(rename($new_image, $new_file_path)) {

    You need to determine the complete new path and name as a single string and pass that as the 2nd parameter. The first parameter needs to be the full path and name to the current file.

  13. 8 hours ago, SaranacLake said:

    I understand that "." is current directory and ".." is one directory up, but I still don't see why my code includes the same directory (recursive) or the directory above it?!

     

    "_photos" and "_thumbnails" and "xxx" are folders in the parent directory, so YES, I expected my code to flag them as such...

    readdir() returns all the "items" in a directory - that includes the '.' and '..', because that is how the file system works. As to your second comment, I think you did not understand @requinix's response. From the 1st line of the description in the manual for readdir()

    Quote

    Returns the name of the next entry in the directory.

    It just returns a string value for the name of the entity. Then, if you look at the manual for is_dir() it states

    Quote

    is_dir ( string $filename ) : bool

    Tells whether the given filename is a directory.

    filename
    Path to the file. If filename is a relative filename, it will be checked relative to the current working directory. If filename is a symbolic or hard link then the link will be resolved and checked. If you have enabled safe mode, or open_basedir further restrictions may apply.

    Is it clear now? You will need to provide the FULL PATH to the file/directory name that is returned from readdir(). Alternatively, you could use glob() instead of readdir and it will return the full path. Not seeing the code to create $handle, I assume you are providing a path to the directory. You would need to append that to the beginning of the file name in order to correctly test using is_dir. However, I think glob() would be a better solution for what you need.

  14. On 12/20/2019 at 3:37 PM, benanamen said:

    Which is why you cant say "@Barand's test makes more sense." Based on OP's code, he expects there could be a negative int, otherwise he wouldn't be checking for it.

    If "int" is negative, @Barands solution will fail (false).

    If the value is a negative integer - it should fail. Factorials of negative numbers is not possible (e.g. division by zero) - unless you want to get into abstract complex numbers which would require the use of the gamma function. 

    The only valid values for a factorial are positive integers from zero to ∞. The only exception I can think of to the ctype_digit() test would be if you wanted to allow a plus symbol; in which case you would still need to remove it during the computation.

  15. 1 hour ago, benanamen said:

    I am wondering why you would be introducing strings when this is specifically about int's. IMO is_int should be used instead of ctype_digit.

    The OP never stated "where" the value is coming from. If the value is coming from a POST/GET variable it will ALWAYS be a string and always fail the is_int() test - even if the value is something like "5". If the value is specifically cast as an integer then there would be no reason to even test if it is an integer to begin with. So, it would only make sense to test if the value "looks" like an integer when it is an unknown string value that can be a string representation of an integer or some other invalid value. @Barand's test makes more sense.

  16. There is nothing in that code to sort the results in the array. readdir() (as stated in the manual) returns the results " . . . in the order in which they are stored by the filesystem". You could determine the file date and sort by that, but  since you are copying them from one device to another, there is a good chance that the file date will be changed in that process. Sometimes the date changes in a copy process and sometimes it does not - depends on the process used. Also complicating things, filetime() will return different values based on the filesystem. As I understand it, in Windows it returns the creation time, whereas in Unix it returns the modification time. So, you could potentially sort using filetime() IF the original file creation times are preserved after they are copied AND filetime() returns the creation date. You should be able to verify if those are both true in your case. If so, get the creation date using filetime() and sort on that. If that is NOT the case, then you could either ensure they are copied in the correct order (i.e. one at a time in the order they were created) or you need to sort using some manner. For example, the named of the files is sequential. So you could sort by file name. But, when you go from IMG_9999.jpg to IMG_10000.jpg it will break that logic as IMG_1... comes before IMG_9... when sorting alpha-numerically. Of course, you could always parse the file names and convert them to have x number of digits, i.e. IMG_9999.jpg converts to IMG_0009999.jpg and IMG_10000.jpg converts to IMG_0010000.jpg. Also, your phone *may* restart that numbering at some point which basically screws all of that up.

    So, lots of possibilities, but no bullet-proof solution. The *best* solution would be predicated on the questions on how the files are handled in the environment (dates when copied, whether file names change, etc.).

    • Like 1
  17. 5 hours ago, Adamhumbug said:

    Hi Psyco,

    
    echo "<td><a class='btn btn-primary col-sm-12' data-toggle='modal' data-userid='" . $uid . "' href='#userModal' data-firstname='" . $ufn ."' data-lastname='". $uln."' data-email='" . $ue . "' data-accountlevel='" . $ualid . "' data-mobile='".$um ."'data-role='".$urid."' data-active-sheets='".$ename."'>Manage</a></td>";

    This is copied directly from my code

    1738610673_Screenshot2019-12-18at09_17_19.png.07ffabb7a664d935758149c620d3b248.png

    This is copied from inspector in Firefox for mac.

    When i take the ' out of Chelsea's

    i get the following

    
    <a class="btn btn-primary col-sm-12" data-toggle="modal" data-userid="2" href="#userModal" data-firstname="Chelsea" data-lastname="Hockley" data-email="chelseahockley@hotmail.com" data-accountlevel="1" data-mobile="07783544882" data-role="1" data-active-sheets="A new event, Chelseas Event">Manage</a>

     

    The PHP code you present puts single quotes around the parameter values, but you are stating that the code in the browser has double quotes around the parameter values. If that is the case, then something is changing the content. What you showed as the output for the $ename variable also points to this. I've known browsers to "self correct" bad code with respect to the display (e.g. if closing tags are missing they may assume they are there), but I've never known a browser to change the code (if that is what is doing it). That is going to make debugging much more difficult than it should be,

  18. On 12/14/2019 at 10:36 PM, Zane said:

    PHP has a handy function for this called:  is_dir()

    What he said. There is no way to positively determine if an element is a folder or file by the name. A files doesn't have to have an extension. It's kind of difficult to create a file w/o an extentiosn, but not impossible. But, the function is_dir() [or the converse is_file()] will positively make that distinction.

    • Like 1
  19. @Adamhumbug What you have posted is impossible and, if the problem is even remotely as you say it is, has nothing to do with a ' character.

    You show that you are outputting the content using

    [ic]echo "<td><a class='btn btn-primary col-sm-12' . . . [/ic]

    Where the string is defined using double-quotes and the parameters of the tags are in single quotes. But, then you show that output like this:

    [ic]<a class="btn btn-primary col-sm-12" . . . [/ic]

    Where the parameters are in double quotes. That is not possible. And it would make  HUGE difference in the output based on if the variables have single/double quotes

     

    Secondly, you state that the value causing the problem is due to a ' character. That is also not possible. If this

    [ic]data-active-sheets='".$ename."'>Manage</a></td>";[/ic]

    Produces this:

    [ic]data-active-sheets="A new event,Chelsea" s="" event'="">Manage</a>[/ic]

    Then the value of $ename is A new event,Chelsea" s="" event'=

  20. Not sure why you have all the unnecessary parameters in the function - unless there is some use I am not seeing. This will produce the same output

    function groupAndExtractByAspect($inputAry, $aspect)
    {
        $outputAry = array();
        foreach($inputAry as $key => $dataAry)
        {
            //Skip if not the selected aspect
            if($dataAry['aspect'] != $aspect) { continue; }
            $outputAry[$dataAry['density']] = $dataAry['resolution'];
        }
        return $outputAry;
    }
    
    $showArray = groupAndExtractByAspect($arrayVideoSpecs, '16:9');
    echo '<pre>';
    print_r($showArray);
    echo '</pre>';

    Alternatively, you could just generate a new multi-dimensional array that create the values for ALL aspect ratios

    function groupAndExtractByAspect($inputAry, $aspect)
    {
        $outputAry = array();
        foreach($inputAry as $key => $dataAry)
        {
            $outputAry[$dataAry['aspect']][$dataAry['density']] = $dataAry['resolution'];
        }
        return $outputAry;
    }

    This will produce:

    Array
    (
        [4:3] => Array
            (
                [442368] => 768x576
                [307200] => 640x480
            )
    
        [16:9] => Array
            (
                [2073600] => 1920x1080
                [121600] => 1280x720
            )
    )

     

  21. As @gw1500se stated, the DELETE query is malformed as it does not include the "FROM" parameter, but it still won't work with that

    $conn->query("DELETE email_user WHERE id='$user_id'");

    $user_id is never defined!!! Aside from that, there are quite a few problems and poor construction. Here are some tips:

    1. Put your DB connection logic in a separate file and include() it on the pages you need it. If you need identical code on multiple scripts, don't use copy/past coding. If you ever need to make a change in your DB connection you would only have to change it one place and not many.

    2. Never user "SELECT *". There are performance and security problems with doing that. Always list the fields you want.

    3. Don't suppress errors using the '@' symbol. You could have simply used an isset() check for the variable in your script.

    if(isset($_GET['key']) && $_GET['key']!=""):

    4. I would highly suggest not wrapping your error conditions in nested if/else conditions in this manner as it makes it difficult to easily "see" which results go with which error

    if(!error_condition_1) {
        if(!error_condition_2) {
            if(!error_condition_3) {
                //Success result
            } else {
                //error result 3
            }
            //error result 2
        }
        //error result 1
    }

    This is MUCH more readable and maintainable IMO

    if(error_condition_1) {
        //error result 1
    } elseif(error_condition_2) {
        //error result 2
    } elseif(error_condition_3) {
        //error result 3
    } else {
        //Success result
    }

    5. You are switching back and forth between object oriented and procedural. Stick with one for consistency

        $fetch = $conn->query("SELECT * FROM email_user WHERE hash = '$hash'");
        //$count = mysqli_num_rows($fetch);
        $count = $fetch->num_rows;

    6. Use prepared statements for your queries.

    7. No need to use a SELECT statement before running the DELETE query. A race condition can create problematic results. You can just run the DELETE query and then check the number of affected rows. If 0, then there was no matching record, else if 1 then you can tell the user they were unsubscribed.

  22. 2 hours ago, phppup said:

    How can I reverse sort from Z to A?

    Or by last modified?

    First, use glob() to store the results into an array variable. Then you can perform operations on that array BEFORE you use the foreach() loop to generate the output. E.g.

    //Get the files in the directory
    $filesAry = glob("{$directory}/*");
    //Sort the array in reverse order
    rsort($filesAry );
    
    //Output the results
    foreach($filesAry as $file)
    {
        //Create the output
    }

    If you want to sort by date/size/etc, then where I have rsort() above, I would run a foreach() loop over the file names and create a multi-dimensional array with all the data, then you can use usort() with a custom function to sort however you wish.

  23. You're saying this produced no results?

    $globFiles = glob('*');
    echo "<pre>" . print_r($globFiles, 1) . "</pre>";

    I find that hard to believe. If you were only trying the code from the manual then, yes, I could see that not producing any results because you many not have ant "txt" files in the directory being scanned.

    Quote

    Doesn't the glob() need a reference directory? 

    Yes it does. And '*' is a reference because the path can be relative from the current working directory. Using '*' should return all the files in the current working directory (i.e. the directory in which the script is executed from). That is why I find it hard to believe that the test code I asked you to try earlier is producing no results. Just to be sure I did not make a mistake, I just ran that code again and it returned all the contents of the directory where I ran the script as expected. Is it returning an empty array or an error? Try this test script and paste the results here:

    $pattern = '*';
    
    $globFiles = glob($pattern);
    if($globFiles===false)
    {
        echo "glob('{$pattern}') returned an error";
    }
    else
    {
        echo "Results of glob('{$pattern}'): <pre>" . print_r($globFiles, 1) . "</pre>";
    }

     

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.