Re: RE: non-auto increment question

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

 



PJ wrote:
> 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";
this is actually: $SQL = "SELECT authID, bookID, ordinal FROM book_author";
>> if ( ( $results = mysql_query($SQL, $db) ) !== false ) {
>> while ( $row = mysql_fetch_assoc($results) ) {
>> $book_author[$row['bookID']][] = $row['authID'];
>> }
>> }
How can I select the author by ordinal? There are only 2 possibilities 1
& 2.
I believe that I need to do something like this - but with to versions -
one as k$Author 1 (referred by ordinal = 1 and $Author2 where ordinal = 2.
$Author = ($authors[$authorID]['first_name']) . ' ' .
($authors[$authorID]['last_name']);
echo $Author;
>>
>> $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'];
Could you explain this, please - this is further from me than Arcturus:
$book_publisher[$row['bookID']][] = $row['publisher_id'];
What is purpose and meaning of all the [] brackets? Especially the empty
ones?
I following your example, I have been able to finally get all the arrays
in place. Only now, I am looking into how to retrieve the parts of the
array...

>> }
>> }
>>
>> $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);
I don't understand - to what does the 1 refer in ---> print_r($book, 1);
it outputs nothing.  If I remove the ", 1" I get a printout of each
array for each row of each book; which is great.  Unless I am dumber
than a dodo, I have to assign the contents of the arrays to variables
that I can then echo in HTML, right?
>> 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! :-)
A couple of questions inserted above.




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