Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从mysql数据库中访问8个会话映像数组的映像名称_Php_Mysql - Fatal编程技术网

Php 如何从mysql数据库中访问8个会话映像数组的映像名称

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

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);
 $_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是,因为我的代码就是您的代码。我没有改变任何事情。我没有重新实施任何东西。