>Problem: How do I display all the tblCountriesOfOperation for one 
>tblContacts record SO THAT MULTIPLE COUNTRIES CAN BE ADDED OR DELETED FOR 
>THAT RECORD?

create table contacts(
  contact_id int(11) unsigned auto_increment unique not null primary key,
  name text
);

create table countries(
  country_code char(2) unique not null primary key,
  name text
);

create table contact_countries(
  contact_id int(11) unsigned,
  country_code char(2),
  unique key contact_country_key(contact_id, country_code)
);

This last table is a "lookup" table, or cross-join table, or ...

Lots of names for it.

Basic idea is to just have a running list of contacts and countries "matched
up" by their IDs.

Sample Data:
insert into contacts(name) values('Rasmus Lerdorf');
insert into contacts(name) values('Ze\'ev Suraski');
insert into contacts(name) values('Andi Gutman);

insert into countries(country_code, name) values('US', 'United States');
insert into countries(country_code, name) values('CA', 'Canada');
insert into countries(country_code, name) values('IL', 'Israel');

insert into contact_countries(1, 'US'); # I think Rasmus is still in Silicon
Valley somewhere
insert into contact_countries(1, 'CA'); # But he used to work in Canada
insert into contact_countries(2, 'US'); # Zeev and Andi are mostly in
Israel, but
insert into contact_countries(2, 'IL'); # but come to the US for conferences
frequently.
insert into contact_countries(3, 'US');
insert into contact_countries(3, 'IL');

The above assumes that your table was empty, so Rasmus is 1, Ze'ev is 2, and
Andi is 3...

This "middle" table, contact_countries, lets you associate as many, or as
few, people with countries as you need.

The display code could be something like this:

<HTML><BODY><FORM ACTION=<?=$PHP_SELF?> METHOD=POST>
<?php
  $contact_id = (int) $_REQUEST['contact_id']; # Don't really care if it's
_GET or _POST
                                               # (int) is a crude but
effective anti-hack measure
  if (isset($_POST['contact_countries'])){
    # First, wipe out all the "old" contact/country for this person:
    $query = "delete from contact_countries where contact_id = $contact_id";
    mysql_query($query) or error_log(mysql_error());
    # Then put in the "new" settings:
    while (list($country_code) = each($contact_countries)){
      $country_code = substr($country_code, 0, 2); # Crude but effective
anti-hack
      $query = "insert into contact_countries(contact_id, country_code) ";
      $query .= " values ($contact_id, $country_code)";
      mysql_query($query) or error_log(mysql_error());
    }
  }
  
  # Display contact name:
  $query = "select name from contacts where contact_id = $contact_id";
  $contact = mysql_query($query) or error_log(mysql_error());
  list($name) = mysql_fetch_row($contact);
  echo "Contact: <B>$name</B><BR>\n<BR>\n";
  
  # Now to display current country selections:
  
  # Crucial:  ' order by name ' lets me run through $contact_countries and
$countries "in parallel"
  $query = "select countries.country_code from contact_countries, countries
";
  $query .= " where contact_id = $contact_id ";
  $query .= "   and countries.country_code = contact_countries.country_code
";
  $query .= " order by name ";
  $contact_countries = mysql_query($query) or error_log(mysql_error());
  
  $query = "select country_code, name from countries order by name ";
  $all_countries = mysql_query($query) or error_log(mysql_error());
  
  $contact_country_row = 0;
  while (list($code, $name) = mysql_fetch_row($all_countries)){
    if ($code == mysql_result($contact_countries, 0, 0)){
      $selected = 'SELECTED';
      $contact_country_row++;
    }
    else{
      $selected = '';
    }
    echo "<INPUT TYPE=CHECKBOX NAME=contact_countries[$code] $selected>
$name<BR>\n";
  }
?>
  <INPUT TYPE=SUBMIT VALUE='Update Countries'>
</FORM></BODY></HTML>

This code is untested, but should be okay other than typos...

-- 
Like Music?  http://l-i-e.com/artists.htm


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

Reply via email to