Php 如何从mysql数据库中访问8个会话映像数组的映像名称
Noobie,如果这个问题很愚蠢,我道歉 我在一个会话中使用了一个包含8个图像的数组。使用以下代码从目录中随机获取这些图像 gameply.php:Php 如何从mysql数据库中访问8个会话映像数组的映像名称,php,mysql,Php,Mysql,Noobie,如果这个问题很愚蠢,我道歉 我在一个会话中使用了一个包含8个图像的数组。使用以下代码从目录中随机获取这些图像 gameply.php: <?php session_start(); $dire="Annotated Dataset/images/"; $images = glob($dire. '*.{jpg,jpeg}', GLOB_BRACE); shuffle($images); $images=array_slice($images,0,8); $_SE
<?php
session_start();
$dire="Annotated Dataset/images/";
$images = glob($dire. '*.{jpg,jpeg}', GLOB_BRACE);
shuffle($images);
$images=array_slice($images,0,8);
$_SESSION['images']=$images;
?>
我有数据库表“images”中存储的目录中所有图像的名称。现在,我想在mysql的帮助下,通过引用表中图像的名称,将会话中的这8个图像显示为一个图库。我尝试使用以下代码:
<?php
session_start();
$galleryimg= $_SESSION['images'];
$conn = mysqli_connect('localhost', 'root', '', 'registration');
for($galleryimg as $key) {
$sql = "SELECT * FROM images
WHERE image_name = '$key'
ORDER BY image_id DESC";
$result = $conn->query($sql);
}
while($row = $result->fetch_assoc()) {
$results_array['data'][$counter] = array ("image" => $row['image_name'],
"scenario" => $row['scenario'], "verified" => $row['verified']);
$counter++;
}
$result=$conn->query($sql);与您的代码无关。
我看到mysqli和PDO的混合使用。这是行不通的。顺便说一下,查询看起来不错。
我的建议是阅读正确的PDO语法并开始使用PDO而不是mysqli。
第二个建议是不要在循环中运行查询,除非有人快死了
免责声明:此答案假设已成功连接到数据库
问题在于:
($gallerymg作为$key)的{
$sql=“从图像中选择*
其中image_name=“$key”
按图像排序_id DESC“;
$result=$conn->query($sql);
}
每次迭代时,$result
都会有一个新值,因为您正在覆盖变量
请使用准备好的语句运行相同的查询n次。它的效率要高得多(对于重复查询),您可以在执行查询后立即获取 然而,学习和让球继续前进是很困难的,但它非常有用
此外,该行(具有更好的缩进):
while($row=$result->fetch_assoc()){
$results\u数组['data'][$counter]=数组(
“image”=>$row['image\u name'],
“场景”=>$row[“场景”],
“已验证”=>$row['verified']
);
$counter++;
}
你什么都不需要$计数器。
只需执行$results_array['data'][]=array(…)代码>以下是您的代码,其中包含一些优化
session_start();
$galleryImgs = $_SESSION['images'];
if(!$conn = new PDO('mysql:host=localhost;dbname=registration', 'root', $pass))
{
die("Error connecting to database.");
}
$imagesIN = "'".join("', '", array_map(function($v) { return str_replace("'", "''", $v); }, $galleryImgs))."'";
$sql = "SELECT * FROM images
WHERE image_name IN ($imagesIN)
ORDER BY image_id DESC";
$stmt = $conn->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll();
$results_array = array('data' => array());
foreach ($result as $row) {
$results_array['data'][] = array
(
"image" => $row['image_name'],
"scenario" => $row['scenario'],
"verified" => $row['verified']
);
}
- 检查连接错误
- 不需要
$counter
变量,因为使用[]
可以为数组创建一个新条目,自动获取下一个索引
- 使用,您可以执行单个查询以获取所有图像数据
- 使用我清理数组,以获得最终可能导致
SQL注入/错误的字符
- 一些压痕
- 在
GalleryMgs
中更改GalleryMg
的变量名称:使用camelcase名称可以提高可读性
通过在where中使用IN子句,可以消除循环和多个SQL查询。因为$gallerymg是
已经是一个数组了,使用内爆来获取IN子句的if图像名称列表很容易实现内爆函数
此外,如果使用的列值有限,则不要使用*,而只列出所需的列名
您还可以使用[]来消除计数器
<?php
session_start();
$galleryimg= $_SESSION['images'];
$conn = mysqli_connect('localhost', 'root', '', 'registration');
$sql = "SELECT
`image_name`,
`scenario`,
`verified`
FROM `images`
WHERE `image_name` in '".implode("','",$galleryimg)."')
ORDER BY `image_id` DESC";
$result = $conn->query($sql);
while($row = $result->fetch_assoc()) {
$results_array['data'][] =
array("image" => $row['image_name'],
"scenario" => $row['scenario'],
"verified" => $row['verified']);
}
问题是什么?如果您向我们展示show CREATE TABLE image的输出,可能会有所帮助
这样我们就可以知道表中有什么了。另外fetch
也丢失了:$result->fetch_row()
或类似的东西。@O.Jones我已经添加了我的table@freeek我已经编辑了代码。。你现在能检查一下这个函数是否正确吗?是的,我确实检查了现在的代码,看起来还可以,但是查询循环是错误的,或者我完全无法理解工作流。看到您得到的输出或稍微扩展一下问题会很好。循环是错误的,是的。不是因为您编写的原因,而是因为(正如我在回答中所述)变量$result
在循环的每次迭代后都有一个新的、不同的值。最后,只有最后一个“图像”存储在$result
中,并存储在$results\u数组['data']
中。您误用了准备好的语句。此外,您的代码可能存在SQL注入漏洞。你不知道$\u会话['images']
中有什么以及它来自哪里。这里有准备
。。。关于$\u会话['images'],它是由脚本设置的,不是由用户通过$\u GET或$\u posit传递的,它来自glob()
。带有“
的文件名非常好。它可能发生。啊,是的,它可能在文件名中。。。很少,但是的。我将编辑我的答案,谢谢。请改用函数($v)使用(&$link){return$link->real_escape_string($v);}
。这是转义字符序列的正确方法。有一些边缘情况是$link->real\u escape\u string
可以防止的。您的代码容易受到SQL注入的攻击。数组$\u会话['images']
包含来自未知源的未知数据。@Uviiii是,因为我的代码就是您的代码。我没有改变任何事情。我没有重新实施任何东西。