Re: insert array values

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Ashley Sheridan wrote:
> On Sun, 2009-03-08 at 17:52 -0500, PJ wrote:
>   
>> Ashley Sheridan wrote:
>>     
>>> On Sun, 2009-03-08 at 16:52 -0500, PJ wrote:
>>>   
>>>       
>>>> Well, I have everything more or less under control... just one little
>>>> thingie...
>>>> I was able to get everything working quite well... basically as I
>>>> thought it should go with a little help from my friends, here on the
>>>> list :-)   many of my problems were small omissions and /or typos and
>>>> misplaced brackets and ;
>>>> The only  thing (probably not) that stymies me is how to get the several
>>>> categories printed out for each book . If there is only one category,
>>>> everything is great... but when there are more than one category, the
>>>> book listing repeats the listing of a book as many times as there are
>>>> categories listed for it... fir instance, there are 10 books listed in
>>>> my test table; i have the book_category table listing 1 book as having 1
>>>> category and another just 2 categories. When running the script with the
>>>> category stuff commented out, I get 10 entries... with the categories on
>>>> I get 11 entries with the one that has 2 categories repeated once.
>>>> What should I post to analyze the problem?
>>>>
>>>> Jim Lucas wrote:
>>>>     
>>>>         
>>>>> PJ wrote:
>>>>>       
>>>>>           
>>>>>> Jim Lucas wrote:
>>>>>>         
>>>>>>             
>>>>>>> PJ wrote:
>>>>>>>  
>>>>>>>           
>>>>>>>               
>>>>>>>> 9el wrote:
>>>>>>>>    
>>>>>>>>             
>>>>>>>>                 
>>>>>>>>> On Sat, Mar 7, 2009 at 5:37 AM, PJ <af.gourmet@xxxxxxxxxxxx
>>>>>>>>> <mailto:af.gourmet@xxxxxxxxxxxx>> wrote:
>>>>>>>>>
>>>>>>>>>     I've done some rethingking and this may be the direction to go:
>>>>>>>>>
>>>>>>>>>     What I need to wind up with is something like this:
>>>>>>>>>
>>>>>>>>>     $sql = "INSERT INTO book_categories ( book_id, category )
>>>>>>>>>        VALUES( '$autoID', '$categoriesID[0]' ),
>>>>>>>>>        ( '$autoID', '$categoriesID[1]' ),
>>>>>>>>>        ( '$autoID', '$categoriesID[2]' ),
>>>>>>>>>        ( '$autoID', '$categoriesID[3]' )
>>>>>>>>>        ( '$autoID', '$categoriesID[4]' )";
>>>>>>>>>
>>>>>>>>>     Does it make sense?
>>>>>>>>>     How do I pass the values to the query?
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> You can run a php loop inside the insert  clause.
>>>>>>>>> But if its already existing record then it woud be UPDATE clause.
>>>>>>>>>
>>>>>>>>>       
>>>>>>>>>               
>>>>>>>>>                   
>>>>>>>> Could I have a small hint as to how to do that. I'll check the manual
>>>>>>>> and search G in the meantime.  Right now, it's Friday night and I'm
>>>>>>>> about to get whammied by the wife... ;-)      have a good night &
>>>>>>>> let's
>>>>>>>> hope for a brighter tomorrow, tomorrow, tomorrowwww
>>>>>>>>
>>>>>>>>     
>>>>>>>>             
>>>>>>>>                 
>>>>>>> To do something like what you are describing above, you would do the
>>>>>>> following:
>>>>>>>
>>>>>>> <?php
>>>>>>>
>>>>>>> # Setup your DB connection etc...
>>>>>>>
>>>>>>>
>>>>>>> # Build insert statement for your book
>>>>>>> $sql = "INSERT INTO books (title, author, etc...) VALUES ('To kill a
>>>>>>> mocking bird', 'Harper Lee', etc...)";
>>>>>>>
>>>>>>> # Execute insert statement
>>>>>>> if ( ( $results = mysql_query($sql, $dblink) ) !== false ) {
>>>>>>>
>>>>>>>     # Grab last insert ID for my thread
>>>>>>>     $last_id = mysql_insert_id($dblink);
>>>>>>>
>>>>>>>     # Check to see if any categories were choosen
>>>>>>>     if ( $categoriesIN ) {
>>>>>>>         $values = array();
>>>>>>>
>>>>>>>         # Loop through each category and build VALUES entry...
>>>>>>>         foreach ( $categoriesIN as $k => $id ) {
>>>>>>>
>>>>>>>             # Build VALUES entry, plus run $id through escape
>>>>>>> function for sanity
>>>>>>>             $values[] = "( {$last_id},
>>>>>>> ".mysql_real_escape_string($id)." )";
>>>>>>>         }
>>>>>>>
>>>>>>>         # Join the VALUES entries just created and separate them
>>>>>>> with a comma
>>>>>>>         $sql = "INSERT INTO book_categories ( book_id, category )
>>>>>>> VALUES " . join(', ', $values);
>>>>>>>
>>>>>>>           
>>>>>>>               
>>>>> At this point, if you echo'ed this.  You would get this
>>>>>
>>>>> INSERT INTO book_categories ( book_id, category ) VALUES ( 1, 3 ), (
>>>>> 1, 5 ), ( 1, 7 ), etc...
>>>>>
>>>>> This basically takes all your inserts that would be done individually
>>>>> and groups them into one insert call.  This helps because it causes
>>>>> the table not to re-index a zillion times.
>>>>>
>>>>> You will still end up with unique row entries for each category and
>>>>> autoID group.  They will not be grouped together in one row as you
>>>>> suggest below.
>>>>>
>>>>>       
>>>>>           
>>>>>>>         # Execute book 2 categories SQL entry
>>>>>>>         if ( ( $results = mysql_query($sql, $dblink) ) === false ) {
>>>>>>>
>>>>>>>             # If it fails, show me why
>>>>>>>             echo 'Book to category entry failed:
>>>>>>> '.mysql_error($dblink);
>>>>>>>         }
>>>>>>>     }
>>>>>>> } else {
>>>>>>>     # Show why my book SQL entry failed
>>>>>>>     echo "Book insert failed: ".mysql_error($dblink);
>>>>>>> }
>>>>>>>
>>>>>>> ?>
>>>>>>>
>>>>>>> That is about as best as can be explained.
>>>>>>>
>>>>>>> BTW - I took away the quotes around your values in your second
>>>>>>> insert statement.  They are numbers and numbers should not have
>>>>>>> quotes around them.
>>>>>>>
>>>>>>> Hopefully this works, or guides you in the direction of the answer
>>>>>>> you seek.
>>>>>>>
>>>>>>>   
>>>>>>>           
>>>>>>>               
>>>>>> Interesting... but, if I understand right (and I am not wet behind the
>>>>>> ears but a newbie nevertheless), this would just enter a series of comma
>>>>>> separated values in one field (the category field; the book_id is taken
>>>>>> care of by an earlier insert followed by
>>>>>> $autoId = mysql_insert_id($result);
>>>>>> which is then inserted in to the book_id)
>>>>>>
>>>>>> To do what you are suggesting could probably be done in a simpler way by
>>>>>> using the implode function... but what I am really trying to do should
>>>>>> give a result like the one in my original post.
>>>>>> Problem is: the insert is not always going to be the same length; that
>>>>>> is there may be 2 categories selected or 3 or 4 so the insert statement
>>>>>> has to be created on the fly. So, far no one has figured out a way to do
>>>>>> it. :-(
>>>>>>
>>>>>> An alternative, and I'm going to try that now is to do a switch or case
>>>>>> or whatever it is and set up 3 or 4 inserts with 1 to 4 VALUES and then
>>>>>> populate them from the array.
>>>>>>
>>>>>> Or another way may be even simpler: implode the array and save to one
>>>>>> field and when querying explode it. :-)
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>         
>>>>>>             
>>>> -- 
>>>> unheralded genius: "A clean desk is the sign of a dull mind. "
>>>> -------------------------------------------------------------
>>>> Phil Jourdan --- pj@xxxxxxxxxxxxx
>>>> http://www.ptahhotep.com
>>>> http://www.chiccantine.com/andypantry.php
>>>>
>>>>     
>>>>         
>>> If you want to display all the categories for each book, then maybe the
>>> best way is to first retrieve the list of books sans category join (with
>>> any WHERE clauses to limit the result-set how you wish) and then as
>>> you're in the loop outputting the books, perform a quick query to
>>> retrieve the categories for the current book.
>>>   
>>>       
>> You lose me here as I am rather primitive in my understanding of most of
>> this.
>> What do you mean to "retrieve the list of books sans category join?
>> That's what I can do with no problem. Do you mean to save the results in
>> some way to another table or view (or whatever) and then retrieve the
>> categories separately to another table and then join that?
>>
>> At present, I'm echoing the list of books to an html formatted page (via
>> php). As I looooove things complicated, I thought of adding the
>> categories in the output but if it becomes too too much then I can just
>> forget the categories and deal with them on category pages.
>>
>> I thought if might be possible to output the array (at the point just
>> before echoing) imploded as one string or doing a subquery at thisi
>> point; but using a subquery doesn't look too promising.
>>
>>     
>>> The other way I'd do it is to retrieve the full results set (the 11
>>> results one) and put all of that into an multi-dimensional array, such
>>> as:
>>>   
>>>       
>> This seems a little complicated for my peanut brain, but I may have to
>> try it. :-\
>>     
>>> $books = Array();
>>> while($row = mysql_fetch_array($result))
>>> {
>>>   if(!isset($books[$row['id']]))
>>>   {
>>>     $books[$row['id']] = Array();
>>>     $books[$row['id']]['name'] = $row['name'];
>>>     // add more book info here
>>>
>>>     // categories as an array
>>>     $books[$row['id']]['categories'] = Array();
>>>   }
>>>
>>>   // book categories added here in second level of array
>>>   $books[$row['id']['categories'][] = $row['book_cat'];
>>> }
>>>
>>> the $row['id'] here is just the unique id of the row for the books
>>> table.
>>>
>>>
>>> Ash
>>> www.ashleysheridan.co.uk
>>>
>>>
>>>   
>>>       
>> -- 
>> unheralded genius: "A clean desk is the sign of a dull mind. "
>> -------------------------------------------------------------
>> Phil Jourdan --- pj@xxxxxxxxxxxxx
>>    http://www.ptahhotep.com
>>    http://www.chiccantine.com/andypantry.php
>>
>>
>>     
> Basically, just get the list of books (the list of 10) and do something
> like this:
>
> while($row = mysql_fetch_array($result))
> {
>   $query2 = "SELECT * FROM `book_categories` WHERE `id`={$row['id']}";
>   $result2 = mysql_query($query2);
>   while($row2 = mysql_fetch_array($result2))
>   {
>     // do stuff with categories here
>   }
> }
>
>
> Ash
> www.ashleysheridan.co.uk
>   
I did try something like this but I had the same mistake in the second
query as I had in the first. I think this puts me in a clearer
perspective. I'll get to it tomorrow morning. It's only 10:30pm here...
I'm surprised that there are other crazies like me out there (24/7 birds).
Really appreciate your insights. :-)

-- 
unheralded genius: "A clean desk is the sign of a dull mind. "
-------------------------------------------------------------
Phil Jourdan --- pj@xxxxxxxxxxxxx
   http://www.ptahhotep.com
   http://www.chiccantine.com/andypantry.php


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux