Reputation: 9
I'm trying to get a webpage to show images but it doesn't seem to be working.
here's the code:
<?php
$files = glob("images/*.*");
for ($i=1; $i<count($files); $i++)
{
$num = $files[$i];
echo '<img src="'.$num.'" alt="random image">'." ";
}
?>
If the code should work, where do i put it? If not, is there a better way to do this?
Upvotes: 0
Views: 111
Reputation: 27607
This would go into a PHP file (images.php
for example) in the parent directory of the images
folder you are listing the images from. You can also simplify your loop (and correct it, since array indexes should start at 0
, not 1
) by using the following syntax:
<?php
foreach (glob("images/*.*") as $file){
echo '<img src="'.$file.'" alt="random image"> ';
}
?>
Upvotes: 1
Reputation: 12985
/**
* Lists images in any folder as long as it's inside your $_SERVER["DOCUMENT_ROOT"].
* If it's outside, it's not accessible.
* Returns false and warning or array() like this:
*
* <code>
* array('/relative/image/path' => '/absolute/image/path');
* </code>
*
* @param string $Path
* @return array/bool
*/
function ListImageAnywhere($Path){
// $Path must be a string.
if(!is_string($Path) or !strlen($Path = trim($Path))){
trigger_error('$Path must be a non-empty trimmed string.', E_USER_WARNING);
return false;
}
// If $Path is file but not folder, get the dirname().
if(is_file($Path) and !is_dir($Path)){
$Path = dirname($Path);
}
// $Path must be a folder.
if(!is_dir($Path)){
trigger_error('$Path folder does not exist.', E_USER_WARNING);
return false;
}
// Get the Real path to make sure they are Parent and Child.
$Path = realpath($Path);
$DocumentRoot = realpath($_SERVER['DOCUMENT_ROOT']);
// $Path must be inside $DocumentRoot to make your images accessible.
if(strpos($Path, $DocumentRoot) !== 0){
trigger_error('$Path folder does not reside in $_SERVER["DOCUMENT_ROOT"].', E_USER_WARNING);
return false;
}
// Get the Relative URI of the $Path base like: /image
$RelativePath = substr($Path, strlen($DocumentRoot));
if(empty($RelativePath)){
// If empty $DocumentRoot === $Path so / will suffice
$RelativePath = DIRECTORY_SEPARATOR;
}
// Make sure path starts with / to avoid partial comparison of non-suffixed folder names
if($RelativePath{0} != DIRECTORY_SEPARATOR){
trigger_error('$Path folder does not reside in $_SERVER["DOCUMENT_ROOT"].', E_USER_WARNING);
return false;
}
// replace \ with / in relative URI (Windows)
$RelativePath = str_replace('\\', '/', $RelativePath);
// List files in folder
$Files = glob($Path . DIRECTORY_SEPARATOR . '*.*');
// Keep images (change as you wish)
$Files = preg_grep('~\\.(jpe?g|png|gif)$~i', $Files);
// Make sure these are files and not folders named like images
$Files = array_filter($Files, 'is_file');
// No images found?!
if(empty($Files)){
return array(); // Empty array() is still a success
}
// Prepare images container
$Images = array();
// Loop paths and build Relative URIs
foreach($Files as $File){
$Images[$RelativePath.'/'.basename($File)] = $File;
}
// Done :)
return $Images; // Easy-peasy, general solution!
}
// SAMPLE CODE COMES HERE
// If we have images...
if($Images = ListImageAnywhere(__FILE__)){ // <- works with __DIR__ or __FILE__
// ... loop them...
foreach($Images as $Relative => $Absolute){
// ... and print IMG tags.
echo '<img src="', $Relative, '" >', PHP_EOL;
}
}elseif($Images === false){
// Error
}else{
// No error but no images
}
Try this on for size. Comments are self explanatory.
Upvotes: 0
Reputation: 10057
You'd need to put this code in a directory that contains a directory named "images". The directory named "images" also needs to have files in a *.*
name format. There are definitely better ways to do what you're trying to do. Such would be using a database that contains all the images that you want to display.
If that doesn't suit what you want to do, you'd have to be much more descriptive. I have no idea what you want to do and all I'm getting from the code you showed us is to render every file in a directory called "images" as an image.
However, if this point of this post was to simply ask "How do I execute PHP?", please do some searching and never bother us with a question like that.
Another thing @zerkms noticed was that your for ..
loop starts at iteration 1 ($i = 1
). This means that a result in the array will be skipped over.
for ($i = 0; $i < count($files); $i++) {
Upvotes: 3
Reputation: 144
This code snippet iterates over the files in the directory images/ and echos their filenames wrapped in <img>
tags. Wouldn't you put it where you want the images?
Upvotes: 1