Array foreach loop proplem

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

tito85
Forum Contributor
Posts: 104
Joined: Sat Mar 13, 2010 11:26 am

Array foreach loop proplem

Post by tito85 »

Hi,

I have a drop down menu as multiple so multiple values can be selected. Now I need to loop trough an array so that for each selected value a new row/insert is done in MySQL.

I am trying the following but no success. Any help please?

Code: Select all


<select name="ddlGenres" size="5" multiple> //Drop Down name

        $genrearray = $_POST['ddlGenres'];

        $LastMovieID = mysql_insert_id();

	$selectedgenre = array($genrearray);
	foreach($_POST as $key => $selectedgenre) 
	{		  
		$insert2 = "INSERT INTO genres (MovieID, GenreTypeID) VALUES ('" . mysql_real_escape_string($LastMovieID) . "', '" . mysql_real_escape_string($selectedgenre) . "')";
		mysql_query($insert2) or die(mysql_error());
        }

Brenden
Forum Newbie
Posts: 12
Joined: Fri May 28, 2010 2:12 am

Re: Array foreach loop proplem

Post by Brenden »

edit: cancel that. I need more time to figure out how your code is meant to work
tito85
Forum Contributor
Posts: 104
Joined: Sat Mar 13, 2010 11:26 am

Re: Array foreach loop proplem

Post by tito85 »

Thanks Brenden, If I can give other information let me know because I'm stuck and in need of help asap please.

Thanks again.
User avatar
AbraCadaver
DevNet Master
Posts: 2572
Joined: Mon Feb 24, 2003 10:12 am
Location: The Republic of Texas
Contact:

Re: Array foreach loop proplem

Post by AbraCadaver »

Something like this (you need to specify the select name as an array):
[text]
<select name="ddlGenres[]" size="5" multiple>[/text]

Code: Select all

$genrearray = $_POST['ddlGenres'];
$LastMovieID = mysql_insert_id();

//$selectedgenre = array($genrearray);  //what is this?

foreach($genrearray as $selectedgenre)
{                
   $insert2 = "INSERT INTO genres (MovieID, GenreTypeID) VALUES ('" . mysql_real_escape_string($LastMovieID) . "', '" . mysql_real_escape_string($selectedgenre) . "')";
   mysql_query($insert2) or die(mysql_error());
}
mysql_function(): WARNING: This extension is deprecated as of PHP 5.5.0, and will be removed in the future. Instead, the MySQLi or PDO_MySQLextension should be used. See also MySQL: choosing an API guide and related FAQ for more information.
tito85
Forum Contributor
Posts: 104
Joined: Sat Mar 13, 2010 11:26 am

Re: Array foreach loop proplem

Post by tito85 »

Hi,

If I just click the submit key without inserting anything in any field it is telling me;

Notice: Undefined index: ddlGenres in C:\wamp\www\movie\addmovie.php on line 11

Where line 11 is:

Code: Select all

	
 $genrearray = $_POST['ddlGenres'];
Any help please?
User avatar
AbraCadaver
DevNet Master
Posts: 2572
Joined: Mon Feb 24, 2003 10:12 am
Location: The Republic of Texas
Contact:

Re: Array foreach loop proplem

Post by AbraCadaver »

Code: Select all

isset()
mysql_function(): WARNING: This extension is deprecated as of PHP 5.5.0, and will be removed in the future. Instead, the MySQLi or PDO_MySQLextension should be used. See also MySQL: choosing an API guide and related FAQ for more information.
tito85
Forum Contributor
Posts: 104
Joined: Sat Mar 13, 2010 11:26 am

Please Help Re: Array foreach loop proplem

Post by tito85 »

Hi,

I would need some furture help please. If I use the isset(), No genres are added to the movie. And another thing is that now if I only add data in tha mandatory fields many Notices and Warnings are coming out...

Notice: Undefined offset: 1 in C:\wamp\www\movie\addmovie.php on line 20
Notice: Undefined offset: 2 in C:\wamp\www\movie\addmovie.php on line 21
Notice: Undefined offset: 1 in C:\wamp\www\movie\addmovie.php on line 23
Notice: Undefined offset: 2 in C:\wamp\www\movie\addmovie.php on line 24
Warning: mktime() expects parameter 5 to be long, string given in C:\wamp\www\movie\addmovie.php on line 25
Warning: mktime() expects parameter 5 to be long, string given in C:\wamp\www\movie\addmovie.php on line 26
Warning: Invalid argument supplied for foreach() in C:\wamp\www\movie\addmovie.php on line 42

And the "Only .jpg images are allowed to be uploaded" is displayed too.

Here is all the page code maybe someone can spot the mistakes...

Code: Select all

<?php
  session_start();
  require('dbconnect.php');
  include('securitycheck.php');
  if ($isAdmin) {
      if (isset($_POST['btnCancel'])) {
          header('Location: movies.php');
      } elseif (isset($_POST['btnAddMovie'])) {
          $title = $_POST['txtTitle'];
          $director1 = $_POST['txtDirector1'];
          $genrearray = isset($_POST['ddlGenres']);
          if (strlen(trim($title)) > 0 && strlen(trim($director1)) > 0 && $genrearray != "0") {
              $director2 = $_POST['txtDirector2'];
              $moviereleasedate = explode("/", $_POST['txtmovieReleaseDate']);
              $dvdreleasedate = explode("/", $_POST['txtDVDReleaseDate']);
              $image = $_FILES['txtImage'];
              $rating = $_POST['ddlRating'];
              $review = $_POST['txtReview'];
              $moviereleaseday = $moviereleasedate[0];
              $moviereleasemonth = $moviereleasedate[1];
              $moviereleaseyear = $moviereleasedate[2];
              $dvdreleaseday = $dvdreleasedate[0];
              $dvdreleasemonth = $dvdreleasedate[1];
              $dvdreleaseyear = $dvdreleasedate[2];
              $moviereleasedate = date("Y-m-d", mktime(0, 0, 0, $moviereleasemonth, $moviereleaseday, $moviereleaseyear));
              $dvdreleasedate = date("Y-m-d", mktime(0, 0, 0, $dvdreleasemonth, $dvdreleaseday, $dvdreleaseyear));
              $filename = "NoImage.jpg";
              //Checking if an Image was Uploaded
              if ($image) {
                  //Checking if the Image is .JPG
                  if ($image['type'] == "image/jpeg" || $image['type'] == "image/pjpeg") {
                      $filename = $image['name'];
                      //Uploading the Image File
                      move_uploaded_file($image['tmp_name'], "Images/Movies/" . $image['name']);
                  } else {
                      $message = "Only .jpg images are allowed to be uploaded";
                  }
              }
              $insert = "INSERT INTO movies (Title, Review, Rating, MovieReleaseDate, DVDReleaseDate, Director1, Director2, Filename) VALUES ('" . mysql_real_escape_string($title) . "', '" . mysql_real_escape_string($review) . "', '" . $rating . "', '" . $moviereleasedate . "', '" . $dvdreleasedate . "', '" . mysql_real_escape_string($director1) . "', '" . mysql_real_escape_string($director2) . "', '" . $filename . "')";
              mysql_query($insert) or die(mysql_error());
              $LastMovieID = mysql_insert_id();
              foreach ($genrearray as $selectedgenre) {
                  $insert2 = "INSERT INTO genres (MovieID, GenreTypeID) VALUES ('" . mysql_real_escape_string($LastMovieID) . "', '" . mysql_real_escape_string($selectedgenre) . "')";
                  mysql_query($insert2) or die(mysql_error());
              }
          } else {
              $message = "Error: <b>Title</b>, <b>Director</b> and <b>Genre</b> are mandatory";
          }
      }
  } else {
      header('Location: index.php');
  }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" href="CSSWebStyles/style.css" />
<link rel="shortcut icon" href="Images/filmicon.ico"/>
<title>Add Movie</title>
</head>
<body>
<div id="website">
<?php
  include('banner.php');
?>
<?php
  //checking if the user is an administrator
  if (isset($_SESSION['superadmin'])) {
      if ($_SESSION['superadmin'])
          include('adminmenu.php');
  }
?>
<div id="content">
<center>
<br />
<h2>Add Movie</h2>
<br />
</center>
<div id="contentgeneral">
<?php
  if (isset($message)) {
      echo "<center>$message</center>";
      unset($message);
  }
?>
<form method="post" enctype="multipart/form-data">
<table>
<tr>
<td>
Title
</td>
<td>
<input type="text" style="width: 300px;" name="txtTitle" />*
</td>
</tr>
<tr>
<td>
Director 1
</td>
<td>
<input type="text" style="width: 300px;" name="txtDirector1" />*
</td>
</tr>
<tr>
<td>
Director 2
</td>
<td>
<input type="text" style="width: 300px;" name="txtDirector2" />
</td>
</tr>
<tr>
<td>
Genre
</td>
<td>
<select name="ddlGenres[]" size="5" multiple>
<option value="0">Please Select One or More:</option>
<?php
  $query = "SELECT * FROM genretypes ORDER BY Genre ASC";
  $result = mysql_query($query);
  while ($genre = mysql_fetch_array($result)) {
      echo "<option value=\"" . $genre['GenreTypeID'] . "\">" . $genre['Genre'] . "</option>";
  }
?>
</select>*
</td>
</tr>
<tr>
<td valign="top">
Rating
</td>
<td>
<select name="ddlRating">
<option value="0">Please Select</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
</select>
</td>
</tr>
<tr>
<td valign="top">
Movie Release Date
</td>
<td>
<input type="text" style="width: 100px;" name="txtmovieReleaseDate" /><small>Date Format: (dd/mm/yyyy)</small><br />
</td>
</tr>
<tr>
<td valign="top">
DVD Release Date
</td>
<td>
<input type="text" style="width: 100px;" name="txtDVDReleaseDate" /><small>Data Format: (dd/mm/yyyy)</small><br />
</td>
</tr>
<tr>
<td valign="top">
Review
</td>
<td>
<textarea name="txtReview" rows="10" cols="100"></textarea>
</td>
</tr>
<tr>
<td valign="top">
Image
</td>
<td>
<input type="file" name="txtImage" />
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" name="btnAddMovie" value="Add" />&nbsp;&nbsp;&nbsp;&nbsp;<input type="submit" name="btnCancel" value="Cancel" />
</td>
</tr>
</table>
</form>
</div>
</div>
<?php
  //will include the code from footer.php file
  include('footer.php');
?>
</div>
</body>
</html>
Thanks for any help and for your time!
User avatar
Jonah Bron
DevNet Master
Posts: 2764
Joined: Thu Mar 15, 2007 6:28 pm
Location: Redding, California

Re: Array foreach loop proplem

Post by Jonah Bron »

Echo the values of $moviereleasedate and $dvdreleasedate immediately after they're defined.

As the error states, mktime expects type integer arguments. It needs to be

Code: Select all

$moviereleasedate = date("Y-m-d", mktime(0, 0, 0, intval($moviereleasemonth),  intval($moviereleaseday), intval($moviereleaseyear)));
Same with $dvdreleasedate.
tito85
Forum Contributor
Posts: 104
Joined: Sat Mar 13, 2010 11:26 am

Re: Array foreach loop proplem

Post by tito85 »

Hi,

What do you mean by "Echo the values of $moviereleasedate and $dvdreleasedate immediately after they're defined."? These values will be inserted in the database.

Another problem is that if I use the isset() with:

Code: Select all

 $genrearray = isset($_POST['ddlGenres']);
no Genres are added to the database. However if I don't use the isset(), genres will be added. But, if I just click the submit buttun a Notice is displayed:

Notice: Undefined index: Genres in C:\wamp\www\movie\addmovie.php on line 11 which is:

Code: Select all

 $genrearray = $_POST['ddlGenres'];
Thanks for any help.... :banghead:
User avatar
AbraCadaver
DevNet Master
Posts: 2572
Joined: Mon Feb 24, 2003 10:12 am
Location: The Republic of Texas
Contact:

Re: Array foreach loop proplem

Post by AbraCadaver »

isset() returns true or false, so you are assigning true or false to $genrearray. Do this:

Code: Select all

if(isset($_POST['ddlGenres'])) {
   $genrearray = $_POST['ddlGenres'];
} else {
   $genrearray = array();
}
or

Code: Select all

$genrearray = isset($_POST['ddlGenres']) ? $_POST['ddlGenres'] : array();
mysql_function(): WARNING: This extension is deprecated as of PHP 5.5.0, and will be removed in the future. Instead, the MySQLi or PDO_MySQLextension should be used. See also MySQL: choosing an API guide and related FAQ for more information.
tito85
Forum Contributor
Posts: 104
Joined: Sat Mar 13, 2010 11:26 am

Re: Array foreach loop proplem

Post by tito85 »

Hi there,

Thanks for your help again.

Genres are now being added, however I still have some problems.

First of all I think that the below code is not working. This should check that the fields of Title, Director and Genre are filled as these are mandatory. However it seems it not working because if I try to add a movie without selecting any genre it still adds the movie to the database. And after it adds the movie the "Only .jpg Images can be uploaded" is displayed even if no images was uploaded.

Code: Select all

if (strlen(trim($title)) > 0 && strlen(trim($director1)) > 0 && $genrearray != "0") {
Any idea why please?

Thanks for your time!
User avatar
AbraCadaver
DevNet Master
Posts: 2572
Joined: Mon Feb 24, 2003 10:12 am
Location: The Republic of Texas
Contact:

Re: Array foreach loop proplem

Post by AbraCadaver »

Your array won't ever be equal to 0. Try:

Code: Select all

if (strlen(trim($title)) > 0 && strlen(trim($director1)) > 0 && !empty($genrearray)) {
mysql_function(): WARNING: This extension is deprecated as of PHP 5.5.0, and will be removed in the future. Instead, the MySQLi or PDO_MySQLextension should be used. See also MySQL: choosing an API guide and related FAQ for more information.
tito85
Forum Contributor
Posts: 104
Joined: Sat Mar 13, 2010 11:26 am

Re: Array foreach loop proplem

Post by tito85 »

That worked fine too.

The only problem left is that if no Movie Release date of DVD Release date is inserted the following Notices appears:

Notice: Undefined offset: 1 in C:\wamp\www\movie\addmovie.php on line 19
Notice: Undefined offset: 2 in C:\wamp\www\movie\addmovie.php on line 20

Code: Select all

$moviereleasemonth = $moviereleasedate[1];
$moviereleaseyear = $moviereleasedate[2];
Notice: Undefined offset: 1 in C:\wamp\www\movie\addmovie.php on line 22
Notice: Undefined offset: 2 in C:\wamp\www\movie\addmovie.php on line 23

Code: Select all

$dvdreleasemonth = $dvdreleasedate[1];
$dvdreleaseyear = $dvdreleasedate[2];
Apart from this, a date is being added to the database automatically. Not all times the data is the same. Sometimes is 1970-01-01 or 1999-11-30. I know 1970-01-01 is something related to mktime but other dates don't know about them...

Thanks for your time
Last edited by tito85 on Thu Jun 03, 2010 10:44 am, edited 1 time in total.
User avatar
AbraCadaver
DevNet Master
Posts: 2572
Joined: Mon Feb 24, 2003 10:12 am
Location: The Republic of Texas
Contact:

Re: Array foreach loop proplem

Post by AbraCadaver »

That's because they don't exist because you exploded and empty value. So you need to check if the dates were submitted and if not, don't explode and don't try and use the date parts.
mysql_function(): WARNING: This extension is deprecated as of PHP 5.5.0, and will be removed in the future. Instead, the MySQLi or PDO_MySQLextension should be used. See also MySQL: choosing an API guide and related FAQ for more information.
User avatar
AbraCadaver
DevNet Master
Posts: 2572
Joined: Mon Feb 24, 2003 10:12 am
Location: The Republic of Texas
Contact:

Re: Array foreach loop proplem

Post by AbraCadaver »

Rather than exploding and rebuilding you could do something like:

Code: Select all

if(!empty($_POST['txtmovieReleaseDate'])) {
   $moviereleasedate = date("Y-m-d", strtotime($_POST['txtmovieReleaseDate']));
} else {
   $moviereleasedate = '';
}
mysql_function(): WARNING: This extension is deprecated as of PHP 5.5.0, and will be removed in the future. Instead, the MySQLi or PDO_MySQLextension should be used. See also MySQL: choosing an API guide and related FAQ for more information.
Post Reply