sargeuk40 Posted April 27, 2009 Share Posted April 27, 2009 I have wamp 2 installed and have been following a course php mysql beyond the basics. I am at a stage where I can move a photo by a form to a folder and then the info is transferred into the database. To view the photos however, does not work. I get the placeholder but no image on a list photos page. All the source and code appears correct and can be copied from his tutorial should you go wrong. I am using xp. I am completely baffled. the image info comes up in firefox when right clicked with alt text missing but there wasn't any there initially. Image info but no image- what am I doing wrong? Link to comment https://forums.phpfreaks.com/topic/155809-cannot-view-image-in-browser/ Share on other sites More sharing options...
trq Posted April 27, 2009 Share Posted April 27, 2009 We need to see relevent code before we can help. Link to comment https://forums.phpfreaks.com/topic/155809-cannot-view-image-in-browser/#findComment-820151 Share on other sites More sharing options...
sargeuk40 Posted April 27, 2009 Author Share Posted April 27, 2009 We need to see relevent code before we can help. "2ND ATTEMPT I COPIED IN THE PHOTOGRAPH CODE INCORRECTLY, HERE IT IS I understand. There are several pages that could affect things but will enclose the page that is essentially failing: Code as follows: "List Photos" <?php echo output_message($message); ?> <table class="bordered"> <tr> <th>Image</th> <th>Filename</th> <th>Caption</th> <th>Size</th> <th>Type</th> <th> </th> </tr> <?php foreach($photos as $photo): ?> <tr> <td><img src="../<?php echo $photo->image_path(); ?>" width="100" /></td> <td><?php echo $photo->filename; ?></td> <td><?php echo $photo->caption; ?></td> <td><?php echo $photo->size_as_text(); ?></td> <td><?php echo $photo->type; ?></td> <td><a href="delete_photo.php?id=<?php echo $photo->id; ?>">Delete</a></td> </tr> <?php endforeach; ?> </table> <br /> <a href="photo_upload.php">Upload a new photograph</a> <?php include_layout_template('admin_footer.php'); ?> There is also a page storing all the criteria revolning around the photos. I will enclose that too as it contains a lot of the called for information: Photograph: <?php // If it's going to need the database, then it's // probably smart to require it before we start. require_once(LIB_PATH.DS.'database.php'); class Photograph extends DatabaseObject { protected static $table_name="photographs"; protected static $db_fields=array('id', 'filename', 'type', 'size', 'caption'); public $id; public $filename; public $type; public $size; public $caption; private $temp_path; protected $upload_dir="images"; public $errors=array(); protected $upload_errors = array( // http://www.php.net/manual/en/features.file-upload.errors.php UPLOAD_ERR_OK => "No errors.", UPLOAD_ERR_INI_SIZE => "Larger than upload_max_filesize.", UPLOAD_ERR_FORM_SIZE => "Larger than form MAX_FILE_SIZE.", UPLOAD_ERR_PARTIAL => "Partial upload.", UPLOAD_ERR_NO_FILE => "No file.", UPLOAD_ERR_NO_TMP_DIR => "No temporary directory.", UPLOAD_ERR_CANT_WRITE => "Can't write to disk.", UPLOAD_ERR_EXTENSION => "File upload stopped by extension." ); // Pass in $_FILE(['uploaded_file']) as an argument public function attach_file($file) { // Perform error checking on the form parameters if(!$file || empty($file) || !is_array($file)) { // error: nothing uploaded or wrong argument usage $this->errors[] = "No file was uploaded."; return false; } elseif($file['error'] != 0) { // error: report what PHP says went wrong $this->errors[] = $this->upload_errors[$file['error']]; return false; } else { // Set object attributes to the form parameters. $this->temp_path = $file['tmp_name']; $this->filename = basename($file['name']); $this->type = $file['type']; $this->size = $file['size']; // Don't worry about saving anything to the database yet. return true; } } public function save() { // A new record won't have an id yet. if(isset($this->id)) { // Really just to update the caption $this->update(); } else { // Make sure there are no errors // Can't save if there are pre-existing errors if(!empty($this->errors)) { return false; } // Make sure the caption is not too long for the DB if(strlen($this->caption) > 255) { $this->errors[] = "The caption can only be 255 characters long."; return false; } // Can't save without filename and temp location if(empty($this->filename) || empty($this->temp_path)) { $this->errors[] = "The file location was not available."; return false; } // Determine the target_path $target_path = SITE_ROOT .DS. 'public' .DS. $this->upload_dir .DS. $this->filename ; // Make sure a file doesn't already exist in the target location if(file_exists($target_path)) { $this->errors[] = "The file {$this->filename} already exists."; return false; } // Attempt to move the file if(move_uploaded_file($this->temp_path, $target_path)) { // Success // Save a corresponding entry to the database if($this->create()) { // We are done with temp_path, the file isn't there anymore unset($this->temp_path); return true; } } else { // File was not moved. $this->errors[] = "The file upload failed, possibly due to incorrect permissions on the upload folder."; return false; } } } public function destroy() { // First remove the database entry if($this->delete()) { // then remove the file // Note that even though the database entry is gone, this object // is still around (which lets us use $this->image_path()). $target_path = SITE_ROOT.DS.'public'.DS.$this->image_path(); return unlink($target_path) ? true : false; } else { // database delete failed return false; } } public function image_path() { return $this->upload_dir.DS.$this->filename; } public function size_as_text() { if($this->size < 1024) { return "{$this->size} bytes"; } elseif($this->size < 1048576) { $size_kb = round($this->size/1024); return "{$size_kb} KB"; } else { $size_mb = round($this->size/1048576, 1); return "{$size_mb} MB"; } } // Common Database Methods public static function find_all() { return self::find_by_sql("SELECT * FROM ".self::$table_name); } public static function find_by_id($id=0) { global $database; $result_array = self::find_by_sql("SELECT * FROM ".self::$table_name." WHERE id=".$database->escape_value($id)." LIMIT 1"); return !empty($result_array) ? array_shift($result_array) : false; } public static function find_by_sql($sql="") { global $database; $result_set = $database->query($sql); $object_array = array(); while ($row = $database->fetch_array($result_set)) { $object_array[] = self::instantiate($row); } return $object_array; } private static function instantiate($record) { // Could check that $record exists and is an array $object = new self; // Simple, long-form approach: // $object->id = $record['id']; // $object->username = $record['username']; // $object->password = $record['password']; // $object->first_name = $record['first_name']; // $object->last_name = $record['last_name']; // More dynamic, short-form approach: foreach($record as $attribute=>$value){ if($object->has_attribute($attribute)) { $object->$attribute = $value; } } return $object; } private function has_attribute($attribute) { // We don't care about the value, we just want to know if the key exists // Will return true or false return array_key_exists($attribute, $this->attributes()); } protected function attributes() { // return an array of attribute names and their values $attributes = array(); foreach(self::$db_fields as $field) { if(property_exists($this, $field)) { $attributes[$field] = $this->$field; } } return $attributes; } protected function sanitized_attributes() { global $database; $clean_attributes = array(); // sanitize the values before submitting // Note: does not alter the actual value of each attribute foreach($this->attributes() as $key => $value){ $clean_attributes[$key] = $database->escape_value($value); } return $clean_attributes; } // replaced with a custom save() // public function save() { // // A new record won't have an id yet. // return isset($this->id) ? $this->update() : $this->create(); // } public function create() { global $database; // Don't forget your SQL syntax and good habits: // - INSERT INTO table (key, key) VALUES ('value', 'value') // - single-quotes around all values // - escape all values to prevent SQL injection $attributes = $this->sanitized_attributes(); $sql = "INSERT INTO ".self::$table_name." ("; $sql .= join(", ", array_keys($attributes)); $sql .= ") VALUES ('"; $sql .= join("', '", array_values($attributes)); $sql .= "')"; if($database->query($sql)) { $this->id = $database->insert_id(); return true; } else { return false; } } public function update() { global $database; // Don't forget your SQL syntax and good habits: // - UPDATE table SET key='value', key='value' WHERE condition // - single-quotes around all values // - escape all values to prevent SQL injection $attributes = $this->sanitized_attributes(); $attribute_pairs = array(); foreach($attributes as $key => $value) { $attribute_pairs[] = "{$key}='{$value}'"; } $sql = "UPDATE ".self::$table_name." SET "; $sql .= join(", ", $attribute_pairs); $sql .= " WHERE id=". $database->escape_value($this->id); $database->query($sql); return ($database->affected_rows() == 1) ? true : false; } public function delete() { global $database; // Don't forget your SQL syntax and good habits: // - DELETE FROM table WHERE condition LIMIT 1 // - escape all values to prevent SQL injection // - use LIMIT 1 $sql = "DELETE FROM ".self::$table_name; $sql .= " WHERE id=". $database->escape_value($this->id); $sql .= " LIMIT 1"; $database->query($sql); return ($database->affected_rows() == 1) ? true : false; // NB: After deleting, the instance of User still // exists, even though the database entry does not. // This can be useful, as in: // echo $user->first_name . " was deleted"; // but, for example, we can't call $user->update() // after calling $user->delete(). } } ?> Finally the Upload Image page looks like this. Please note it successfully uploads the image to the images folder folder and places an entry in the database. Photo_Upload <?php require_once('../../includes/initialize.php'); if (!$session->is_logged_in()) { redirect_to("login.php"); } ?> <?php $max_file_size = 1048576; // expressed in bytes // 10240 = 10 KB // 102400 = 100 KB // 1048576 = 1 MB // 10485760 = 10 MB if(isset($_POST['submit'])) { $photo = new Photograph(); $photo->caption = $_POST['caption']; $photo->attach_file($_FILES['file_upload']); if($photo->save()) { // Success $session->message("Photograph uploaded successfully."); redirect_to('list_photos.php'); } else { // Failure $message = join("<br />", $photo->errors); } } ?> <?php include_layout_template('admin_header.php'); ?> <h2>Photo Upload</h2> <?php echo output_message($message); ?> <form action="photo_upload.php" enctype="multipart/form-data" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max_file_size; ?>" /> <p><input type="file" name="file_upload" /></p> <p>Caption: <input type="text" name="caption" value="" /></p> <input type="submit" name="submit" value="Upload" /> </form> <?php include_layout_template('admin_footer.php'); ?> Any help would be greatly appreciated. I have tried sharing options, alternative path methods to reach the folder. I am on wamp 2 windows xp, firefox. When I click on the image placeholder in the browser i get for instance this message applicable to the upload image - buddhas.jpg The requested URL /photo_gallery/public/images\buddhas.jpg was not found on this server. Any advice? Link to comment https://forums.phpfreaks.com/topic/155809-cannot-view-image-in-browser/#findComment-820156 Share on other sites More sharing options...
sloth456 Posted April 27, 2009 Share Posted April 27, 2009 Place edit your post so that code is enclosed in code tags - it would be much easier to read that way. Link to comment https://forums.phpfreaks.com/topic/155809-cannot-view-image-in-browser/#findComment-820308 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.