Re: RE: non-auto increment question

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

 



Jim Lucas wrote:
> PJ wrote:
>> haliphax wrote:
>>> On Fri, Mar 13, 2009 at 1:24 PM, PJ <af.gourmet@xxxxxxxxxxxx> wrote:
>>>> Jim Lucas wrote:
>>>>> PJ wrote:
>>>>>> am resending as this was erroneously ccd to mysql. sorry!
>>>>>>
>>>>>> Ashley Sheridan wrote:
>>>>>>> On Thu, 2009-02-26 at 11:27 -0500, PJ wrote:
>>>>>>>> Jerry Schwartz wrote:
>>>>>>>>
>>>>>>>>>> Being rather new to all this, I understood from the MySql manual
>>>>>>>>>> that
>>>>>>>>>> the auto_increment is to b e used immediately after an
>>>>>>>>>> insertion not
>>>>>>>>>> intermittently. My application is for administrators (the site
>>>>>>>>>> owner &
>>>>>>>>>> designates) to update the database from and administration
>>>>>>>>>> directory,
>>>>>>>>>> accessed by user/password login... so there's really very little
>>>>>>>>>> possibility of 2 people accessing at the same time.
>>>>>>>>>> By using MAX + 1 I keep the id number in the $idIn and can reuse
>>>>>>>>>> it in
>>>>>>>>>> other INSERTS
>>>>>>>>>>
>>>>>>>>> [JS] Are you looking for something like LAST_INSERT_ID()? If you
>>>>>>>>> INSERT a
>>>>>>>>> record that has an auto-increment field, you can retrieve the
>>>>>>>>> value
>>>>>>>>> that got
>>>>>>>>> inserted with "SELECT LAST_INSERT_ID()". It is
>>>>>>>>> connection-specific, so
>>>>>>>>> you'll always have your "own" value. You can then save it to
>>>>>>>>> reuse,
>>>>>>>>> either
>>>>>>>>> as a session variable or (more easily) as a hidden field on your
>>>>>>>>> form.
>>>>>>>>>
>>>>>>>> Thanks, Jerry,
>>>>>>>>
>>>>>>>>
>>>>>>>> You hit the nail on the head.:)
>>>>>>>>
>>>>>>>> To refine my problem (and reduce my ignorance),here's what is
>>>>>>>> happening
>>>>>>>> on the form page:
>>>>>>>>
>>>>>>>> There is a series of INSERTs. The first inserts all the columns of
>>>>>>>> "book" table except for the id, which I do not specify as it if
>>>>>>>> auto-insert.
>>>>>>>>
>>>>>>>> In subsequent tables I have to reference the book.id (for
>>>>>>>> transitional
>>>>>>>> tables like "book_author"(refers authors to book) etc.
>>>>>>>>
>>>>>>>> If I understand it correctly, I must retrieve ("SELECT
>>>>>>>> LAST_INSERT_ID()") after the first INSERT and before the following
>>>>>>>> insert; and save the id as a string ($id)...e.g. $sql = "SELECT
>>>>>>>> LAST_INSERT_ID() AS $id"
>>>>>>>> I need clarification on the "AS $id" - should this be simply
>>>>>>>> id(does
>>>>>>>> this have to be turned into a value into $id or does $id
>>>>>>>> contain the
>>>>>>>> value? And how do I retrieve it to use the returned value for the
>>>>>>>> next
>>>>>>>> $sql = "INSERT ... - in other words, is the id or $id available
>>>>>>>> for
>>>>>>>> the
>>>>>>>> next directive or do I have to do something like $id = id?
>>>>>>>> I'm trying to figure this out with some trials but my insert
>>>>>>>> does not
>>>>>>>> work from a php file - but it works from command-line... that's
>>>>>>>> another
>>>>>>>> post.
>>>>>>>>
>>>>>>> Here's how I mostly do it (albeit simplified):
>>>>>>>
>>>>>>> $query = "INSERT INTO `sometable`(`title`,`content`)
>>>>>>> VALUES('$title','$content')";
>>>>>>> $result = mysql_query($query);
>>>>>>> $autoId = mysql_insert_id($result);
>>>>>>>
>>>>>>> $query = "INSERT INTO `another_table`(`link_id`,`value`)
>>>>>>> VALUES($autoId,'$value');
>>>>>>> $result = mysql_query($query);
>>>>>>>
>>>>>>> No need to call another query to retrieve the last inserted id, as
>>>>>>> it is
>>>>>>> tied to the last query executed within this session.
>>>>>>>
>>>>>>>
>>>>>>> Ash
>>>>>>> www.ashleysheridan.co.uk
>>>>>> For some reason or other $autoId = mysql_insert_id($result); just
>>>>>> does
>>>>>> not work for me... Yet some of the data is inserted correctly...
>>>>>> I did find that it does not work on tables that are empty... so you
>>>>>> can't start with an empty table. I entered data & it still did not
>>>>>> work.
>>>>>> I tried on another duplicate database... doesn't work.
>>>>>> I have checked & double checked the database, I have added checks
>>>>>> to see
>>>>>> what is returned and the returns are 0 or null - as I get different
>>>>>> responses for slightly different functions.
>>>>>> sessions is on
>>>>>> mysql is 5.1.28
>>>>>> php5
>>>>>>
>>>>>> here's what is parsed:
>>>>>> else { $sql1 = "INSERT INTO book
>>>>>> Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  ( title, sub_title, descr, comment,
>>>>>> bk_cover,
>>>>>> copyright, ISBN, language, sellers )
>>>>>> Â  Â  Â  Â  Â  Â  Â  Â  VALUES
>>>>>> Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  ('$titleIN', '$sub_titleIN',
>>>>>> '$descrIN',
>>>>>> Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  '$commentIN', '$bk_coverIN',
>>>>>> '$copyrightIN',
>>>>>> '$ISBNIN', '$languageIN', '$sellersIN')";
>>>>>> Â  Â  Â  Â  $result1 = mysql_query($sql1, $db);
>>>>>> Â  Â  $autoid = mysql_insert_id($result1);
>>>>>> Â  Â  Â  Â  $sql2 = "INSERT INTO author (first_name, last_name)
>>>>>> VALUES
>>>>>> ('$first_nameIN', '$last_nameIN')";
>>>>>> Â  Â  Â  Â  Â  Â  $result2 = mysql_query($sql2, $db);
>>>>>> Â  Â  $authorID = mysql_insert_id($result2);
>>>>>> Â  Â  Â  Â  $sql2a = "INSERT INTO book_author (authID, bookID,
>>>>>> ordinal)
>>>>>> VALUES ( '$authorID', '$autoid', '1')";
>>>>>> Â  Â  Â  Â  Â  Â  $result2a = mysql_query($sql2a, $db);
>>>>>> Â  Â  Â  Â  $sql2b = "INSERT INTO author (first_name, last_name)
>>>>>> VALUES
>>>>>> ('$first_name2IN', '$last_name2IN')";
>>>>>> Â  Â  Â  Â  Â  Â  $result2b = mysql_query($sql2b, $db);
>>>>>> Â  Â  $author2ID = mysql_insert_id($result2b);
>>>>>> Â  Â  Â  Â  $sql2c = "INSERT INTO book_author (authID, bookID,
>>>>>> ordinal)
>>>>>> VALUES ( '$author2ID', '$autoid', '2')";
>>>>>> Â  Â  Â  Â  Â  Â  $result2c = mysql_query($sql2c, $db);
>>>>>> Â  Â  Â  Â  $sql3 = "INSERT INTO publishers (publisher) VALUES
>>>>>> ('$publisherIN')";
>>>>>> Â  Â  Â  Â  Â  Â  $result3 = mysql_query($sql3, $db);
>>>>>> Â  Â  $publisherID = mysql_insert_id($result3);
>>>>>> Â  Â  Â  Â  $sql3a = "INSERT INTO book_publisher (bookID,
>>>>>> publishers_id)
>>>>>> VALUES ( '$autoid', '$publisherID' )";
>>>>>> Â  Â  Â  Â  Â  Â  $result3a = mysql_query($sql3a, $db);
>>>>>> Â  Â  Â  Â  foreach($_POST['categoriesIN'] as $category){
>>>>>> Â  Â  Â  Â  Â  Â  $sql4 = "INSERT INTO book_categories (book_id,
>>>>>> categories_id)
>>>>>> Â  Â  Â  Â  Â  Â  Â  Â  VALUES ($autoid, $category)";
>>>>>> Â  Â  Â  Â  Â  Â  $result4 = mysql_query($sql4,$db);
>>>>>> Â  Â  Â  Â  Â  Â  }
>>>>>> Â  Â  Â  Â  echo $autoid; // shows: "blank"
>>>>>> Â  Â  Â  Â  echo $authorID; // shows: "blank"
>>>>>> Â  Â  Â  Â  echo $author2ID; // shows: "blank"
>>>>>> Â  Â  Â  Â  echo $publisherID; // shows: "blank"
>>>>>> Â  Â  Â  Â  echo "<br>autoid = $autoid<br>";// shows: autoid =
>>>>>> "blank"
>>>>>> Â  Â  Â  Â  echo "authorID = $authorID<br>";// shows: authorID =
>>>>>> "blank"
>>>>>> Â  Â  Â  Â  echo "author2ID = $author2ID<br>";// shows: author2ID =
>>>>>> "blank"
>>>>>> Â  Â  Â  Â  echo "publisherID = $publisherID<br>";// shows:
>>>>>> publisherID =
>>>>>> "blank"
>>>>>>
>>>>>> here is what is inserted:
>>>>>> book is correctly inserted
>>>>>> author is correctly inserted
>>>>>> book_author is correctly inserted
>>>>>> book_categories is correctly inserted
>>>>>> book_publisher bookID = 0 publishers_id = 0 (not correct)
>>>>>> publishers is correctly inserted
>>>>>>
>>>>> You need to take a closer look at this page:
>>>>>
>>>>> http://php.net/manual/en/function.mysql-insert-id.php
>>>>>
>>>>> Under the parameters section, look at the description of the
>>>>> link_identifier. Â It talks about the link_identifier being the
>>>>> database connection handler, not the resulting resource that is
>>>>> returned from a call to mysql_query().
>>>>>
>>>>> Change the value you are passing to mysql_insert_id() to be the $db
>>>>> variable instead of the $results variable and you will probably get
>>>>> the results you are looking for.
>>>>>
>>>>> Also, reading further tells me that since you did not pass
>>>>> mysql_insert_id() a valid connection handler, you should have
>>>>> gotten a
>>>>> E_WARNING notice. Â Did you by chance check your logs for this error?
>>>>>
>>>>> Honestly, sounds like you need to turn on full error reporting to the
>>>>> screen.
>>>>>
>>>>> Place the following at the top of your script and you might see the
>>>>> problem a little clearer.
>>>>>
>>>>>
>>>>> error_reporting(E_ALL);
>>>>> ini_set('display_errors', 1);
>>>>>
>>>>>
>>>>> This will make it so that every error is reported to the screen and
>>>>> not just logged.
>>>>>
>>>> Thanks much for your input. This is great. Now I can seeeeeee!
>>>> It would have solved a lot of headaches earlier in the process. :-[
>>>> I was able to catch several "Notice:"s and correct them.
>>>> Now things work pretty well...
>>>> Only problem now is to understand the use of subqueries...
>>>> and how to display several authors and categories for books.
>>>> I'm not trying to reinvent the wheel; just trying to make round and
>>>> not
>>>> ssquare. :-) O:-)
>>> This might get you started...
>>>
>>> SELECT * FROM authors WHERE author_id IN (SELECT author_id FROM books
>>> WHERE book_id = ?)
>>>
>>>
>>> HTH,
>> It does, thanks.
>> But here's an interesting question -- in my original select sequence
>> with joins I have a CONCAT_WS(" ", first_name, last_name) as Author :
>>
>> $sql1 = "SELECT  b.id, b.title, b.sub_title, b.descr, b.comment,
>> b.bk_cover, b.copyright, b.ISBN, b.sellers, b.language, c.publisher,
>> CONCAT_WS(' ', first_name, last_name) AS Author
>> FROM book AS b
>> LEFT JOIN book_author AS ab ON b.id = ab.bookID
>> LEFT JOIN author AS a ON ab.authID=a.id
>> LEFT JOIN book_publisher as abc ON b.id = abc.bookID
>> LEFT JOIN publishers AS c ON abc.publishers_id = c.id
>> ORDER BY title ASC ";
>> $result1 = mysql_query($sql1, $db);
>> $bookCount = mysql_num_rows($result1);
>> for ($i=0; $i < $bookCount; $i++) {
>>     $row = mysql_fetch_array($result1);
>>     $bookid[$i]                = $row["id"];
>>     $booktitle[$i]            = $row["title"];      
>> $booksub_title[$i]        = $row["sub_title"];      
>> $bookdescr[$i]            = $row["descr"];      
>> $bookcomment[$i]        = $row["comment"];
>>     $bookbk_cover[$i]        = $row["bk_cover"];
>>     $bookcopyright[$i]    = $row["copyright"];      
>> $bookISBN[$i]            = $row["ISBN"];
>>     $booklanguage[$i]    = $row["language"];
>>     $booksellers[$i]    = $row["sellers"];
>>     $Author[$i]            = $row["Author"];
>>     $publisherspublisher[$i]    = $row["publisher"];
>> }
>>
>> Works fine; but it does not give me 2 authors when there are 2.
>> I wonder if it is possible to do a second
>> CONCAT_WS(' ', first_name, last_name) AS Author2  WHERE
>> (book_author.bookID = '$bookid' && ordinal = '2') --- I probably do not
>> have the right syntax, but you get the idea, I'm sure.
>> The whole point of my exercise is to try to keep things as simple as
>> possible. I am desperately trying to avoid more and more complicated
>> stuff. :-)
>>
>> And I would think that it should be possible to work out some way of
>> integrating another table (book_categories) to retrieve an array of up
>> to, say 4 fields, and store them in a $string (with conditions to show
>> only that which exists) for echoing in HTML.
>> I just see a big problem because the code is parsing all books
>> ......
>> for ($i=0;$i<$bookCount;$i++) {
>>     if (empty($bookbk_cover[$i]))....
>> and unless there's a way to include querys within the "for...)
>> execution... actually, this is what I thought could be done. between
>> echos I would do a query to see if there is another Author, for example,
>> or categories and, if so, echo them at this point and then go on to the
>> next line of code, an echo... does that sound reasonalbe?
>>
>> I'm probably trying to do something that is way over my head, if not
>> impossible, but hell, that's life. :-D and I'm having one hell-of-a time
>> (good, though) 8-)
>
> Ok...  Well, that code is something to behold...
>
> Think of your SQL queries like this.
>
> Each time you do a join in a SQL select, (if you don't involve a where
> clause) you are taking all the records from one table and joining them
> with the other table.  So in the above Select with the four JOIN()'s,
> you are creating this monster of a table (in memory) that is finally
> handed back to PHP.
>
> something to the effect of this.
>     Table A Record count * Table B Record count * Table C Record count
> * Table D Record count * etc...
>
> See how that could grow rather quickly?
>
> What you should do is more like
>
>     Table A Record count + Table B Record count + Table C Record count
> + Table D Record count + etc...
>
> That seems a little more manageable.
>
> <?php
>
>
> $books = array();
>
> $SQL = "SELECT * FROM book ORDER BY title ASC";
> if ( ( $results = mysql_query($SQL, $db) ) !== false ) {
>     while ( $row = mysql_fetch_assoc($results) ) {
>         $books[$row['id']] = $row;
>     }
> }
>
> $book_author = array();
> $SQL = "SELECT id, bookID, authID FROM book_author";
> if ( ( $results = mysql_query($SQL, $db) ) !== false ) {
>     while ( $row = mysql_fetch_assoc($results) ) {
>         $book_author[$row['bookID']][] = $row['authID'];
>     }
> }
>
> $authors = array();
> $SQL = "SELECT id, first_name, last_name FROM author";
> if ( ( $results = mysql_query($SQL, $db) ) !== false ) {
>     while ( $row = mysql_fetch_assoc($results) ) {
>         $authors[$row['id']] = $row;
>     }
> }
>
> $book_publisher = array();
> $SQL = "SELECT id, bookID, publisher_id FROM book_publisher";
> if ( ( $results = mysql_query($SQL, $db) ) !== false ) {
>     while ( $row = mysql_fetch_assoc($results) ) {
>         $book_publisher[$row['bookID']][] = $row['publisher_id'];
>     }
> }
>
> $publishers = array();
> $SQL = "SELECT id, publisher FROM publishers";
> if ( ( $results = mysql_query($SQL, $db) ) !== false ) {
>     while ( $row = mysql_fetch_assoc($results) ) {
>         $publishers[$row['id']] = $row;
>     }
> }
>
> ?>
>
> Now you can do something like this:
>
> <?php
>
> if ( $books ) {
>     echo "<table>";
>     echo "<tr><th>Book Information</th><th>Book Authors</th><th>Book
> Publishers</th></tr>";
>     foreach ( $books AS $bookID => $book ) {
>         echo "<tr>";
>         echo "<td>";
>         print_r($book, 1);
>         echo "</td>";
>         echo "<td>";
>         if ( isset( $book_author[$bookID] ) ) {
>             foreach ( $book_author[$bookID] AS $authorID ) {
>                 if ( isset( $authors[$authorID] ) ) {
>                     print_r($authors[$authorID], 1);
>                 }
>             }
>         }
>         echo "</td>";
>         echo "<td>";
>         if ( isset( $book_publisher[$bookID] ) ) {
>             foreach ( $book_publisher[$bookID] AS $authorID ) {
>                 if ( isset( $publishers[$authorID] ) ) {
>                     print_r($publishers[$authorID], 1);
>                 }
>             }
>         }
>         echo "</td>";
>         echo "</tr>";
>     }
>     echo "</table>";
> }
Hell, Jim, if you're not a teacher, you sure qualify as one.
My biggest problem is one of not understanding just what is going on
with code. Your explanations allow me to get a sort-of visualization of
what is happening. Things begin to fall into place.
Yes, I see how bloated the application would have become.
Thanks again for your input. You rock! :-)

-- 
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