Re: Forming an SQL query

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

 



Ah, I had left out the third column the first time! Thanks.

Now I can insert and not create dupes but for some reason it is not updating.


Here's the code:


      if ( ($_POST['action'] == 'process') && (!sizeof($message) ) )
      {
          foreach($_POST as $key=>$val)
               {
                   //find key/val sets within posts which are both numeric
                   if(is_numeric($key) && is_numeric($val))
                   {
                      $nkey=$key;
                      //add these values ( q_id, a_id ) to sql statement
$qanda[] .= "('1' , '" . $nkey . "' , '" . $val . "')";
                   }
//find key/val sets within sub-arrays of $_POST which are numeric
                   if(is_array($val))
                   {
                       foreach ($val as $akey=>$aval)
                           {
//add these values ( q_id, a_id ) to sql statement $qanda[] .= "('1' , '" . $key . "' , '" . $aval . "')";
                           }
                   }
               }

            $q_a_sql="INSERT INTO" . $userTable . "(u_id, q_id, a_id )
VALUES " . (implode(",",$qanda)) . "on duplicate key UPDATE a_id = VALUES(a_id);";

                  if($q_a_result = mysql_query($q_a_sql))
            {
              unset($_SESSION['required_fields']);
              $cat = $_POST['cat']+1;
              include_once(QUESTIONS . 'q.inc');
            }


?


Kristen G. Thorson wrote:
How is it your plan "thwarted?" It looks fine to me, but maybe I'm missing something. The only thing I can think is that you're not defining your table keys correctly to correctly use ON DUPLICATE KEY. Do you have a key defined for all three columns *together*?

mysql> create table user_answers (u_id int(11) not null, q_id int(11) not null, a_id int(11) not null, unique( u_id, q_id, a_id ) );
Query OK 0 rows affected (0.22 sec)

mysql> insert into user_answers (u_id,q_id,a_id) values (1,1,1),(1,1,2),(1,2,1),(1,1,1) on duplicate key update a_id=values(a_id);
Query OK, 5 rows affected (0.01 sec)
Records: 4  Duplicates: 1  Warnings: 0

mysql>select * from user_answers;
+------+------+------+
| u_id | q_id | a_id |
+------+------+------+
|    1 |    1 |    1 |
|    1 |    1 |    2 |
|    1 |    1 |    3 |
+------+------+------+
3 rows in set (0.00 sec)



So, three different answers for the same user & same question. The one duplicate did not cause an error because of the ON DUPLICATE KEY. This looks like it's what you're trying to do, so then what's your error?



kgt




Jack Jackson wrote:

Hi,
Thanks to everyone's help, that multipage monster of a form is now working properly (yay!).

One problem I have though is that I stick the answers as each page is completed into a table. If the user hits the back button, rather than adding a new row to the table I'd rather update it if it's there. That's fairly straightforward when it's 1:1 questions to answers:

  $q_a_sql='INSERT INTO $userAnswerTable
                  ( q_id, a_id )
                  VALUES ' . (implode(",",$qanda))
                  . ' on duplicate key UPDATE a_id = VALUES(a_id);';

But when it's 1:n, such as with checkboxes, this neat little plan of mine is thwarted.

So if I change the userAnswerTable to three columns, u_id, q_id and a_id, is there a way I can do all the 1:1 and 1:n in the manner I wish?

TIA,
JJ





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