Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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:数组而不是stdClass对象_Php_Mysql_Arrays - Fatal编程技术网

PHP/Mysql:数组而不是stdClass对象

PHP/Mysql:数组而不是stdClass对象,php,mysql,arrays,Php,Mysql,Arrays,我有以下代码: $result = $conn->query($sql)->fetch(PDO::FETCH_COLUMN); $myArray = explode(',', $result); $sql = ("SELECT username,status,location FROM Users WHERE username IN ('" . implode("','",$myArray) . "') AND status > 0 ORDER BY username")

我有以下代码:

$result = $conn->query($sql)->fetch(PDO::FETCH_COLUMN);
$myArray = explode(',', $result);
$sql = ("SELECT username,status,location FROM Users WHERE username IN ('"    . implode("','",$myArray) . "') AND status > 0 ORDER BY username");
$data = $conn->query($sql)->fetchAll(PDO::FETCH_OBJ);
print_r ($data);
FYI$结果为“kk,bb”

结果如下:

Array ( [0] => stdClass Object ( [username] => bb [status] => 1   [location] => ) [1] => stdClass Object ( [username] => kk [status] => 1   [location] => ) )
但我真的只想看到一个二维数组,而不是在每个项目前面显示stdClass对象。我尝试了不同的抓取方法,但这是我唯一能成功的方法。我知道有一些函数可以将对象转换为数组,但我更希望在粘贴的代码中是否有正确的方法来实现这一点


我希望有人能帮忙,提前谢谢

您通过使用
PDO::FETCH_OBJECT
请求了对象。如果要以数组形式提取,请使用其他提取类型:

$data = $conn->query($sql)->fetchAll(PDO::FETCH_ASSOC);

其他选择记录在此处:

顺便问一下,为什么要运行一个查询来获取
$myArray
中的值,然后在第二个查询中以SQL注入方式使用这些值?使用
连接不是更容易吗


请回复您的评论:

首先,我强烈建议您在第一次编写安全代码时,不要依赖于“稍后返回”。您可能没有时间稍后返回,因为一旦代码似乎工作得“足够好”,就有立即投入使用的诱惑。即使您稍后返回修复安全缺陷,也可能会错过一个。无论哪种方式,您的开发过程都会产生使用不安全代码的高风险

著名计算机科学家Andrew S.Tanenbaum的一条老建议是:“安全性和正确性一样,不是附加功能。”

现在谈谈加入。如果您使用SQL,您应该了解如何进行连接。不了解SQL中的连接就像认为自己了解PHP,即使不知道如何使用
foreach()
。从技术上讲,你仍然可以做一些事情,但是你错过了语言的一个主要部分

联接允许您在一个查询中查询多个表,并从每个表中查找匹配的行

在您的示例中,我不知道您的第一个查询,但我猜它会查询其他表以获得用户名列表。可能它会查询电子邮件收件人的用户列表,如下所示:

SELECT username FROM EmailRecipients WHERE EmailId = 1234
然后,代码在第二个查询中使用用户名的结果列表。但您可以在一个查询中完成这一切:

SELECT Users.username, Users.status, Users.location
FROM Users JOIN EmailRecipients 
  ON Users.username = EmailRecipients.username
WHERE EmailRecipients.EmailId = 1234
SQL引擎搜索EmailRecipients表,并表示它为电子邮件1234的收件人找到了六行。对于这六行中的每一行,它都会在Users表中查找具有匹配用户名的对应行。然后,它使用SELECT结果中这些行中的列

当您连接表时,两个表可能都有一些同名的列。这就是为什么我通过将列限定为属于一个表或另一个表来显示名为的列。这消除了您在每种情况下所指的表的模糊性

先列出哪个表并不重要。这种类型的连接从左到右与从右到水平相同,就像代数中的一些表达式一样(2+4与4+2相同,等等)。MySQL会自动计算出哪个表最适合首先读取

关于连接还有更多需要了解的内容,但这应该会让您开始学习。我建议你找个时间读一本关于SQL的教程或书


请回复您的评论:

“第二个查询中的SQL注入方式”在哪里

在代码中:

$result=$conn->query($sql)->fetch(PDO::fetch_列); $myArray=explode(“,”,$result); $sql=(“从用户名所在的用户中选择用户名、状态和位置(“.”。内爆(“,”,$myArray)。“”)和状态>0按用户名排序”); $data=$conn->query($sql)->fetchAll(PDO::FETCH_OBJ)

无法保证在SQL语句中使用$myArray中的元素是安全的。仅仅因为它们来自数据库并不能保证它们的安全。如果它们包含像“O'Reilly”这样的名字呢?这会让你的报价崩溃

您永远无法100%确定数据是否安全,因此最好使用查询参数。然后您就不在乎它是否安全了,因为绑定参数从来不会与SQL查询字符串组合

下面介绍如何从数组中为
IN()
谓词创建动态列表,并使用PDO将参数值绑定到查询:

$result = $conn->query($sql)->fetch(PDO::FETCH_COLUMN);
$myArray = explode(',', $result);
$placeholders = implode(',', array_fill(0, count($myArray), '?'));
$sql = "
  SELECT username,status,location FROM Users 
  WHERE username IN ($placeholders) AND status > 0 
  ORDER BY username");
$stmt = $conn->prepare($sql);
$stmt->execute($myArray);
$data = $stmt->fetchAll(PDO::FETCH_OBJ);

您通过使用
PDO::FETCH_OBJECT
请求对象。如果要以数组形式提取,请使用其他提取类型:

$data = $conn->query($sql)->fetchAll(PDO::FETCH_ASSOC);

其他选择记录在此处:

顺便问一下,为什么要运行一个查询来获取
$myArray
中的值,然后在第二个查询中以SQL注入方式使用这些值?使用
连接不是更容易吗


请回复您的评论:

首先,我强烈建议您在第一次编写安全代码时,不要依赖于“稍后返回”。您可能没有时间稍后返回,因为一旦代码似乎工作得“足够好”,就有立即投入使用的诱惑。即使您稍后返回修复安全缺陷,也可能会错过一个。无论哪种方式,您的开发过程都会产生使用不安全代码的高风险

著名计算机科学家Andrew S.Tanenbaum的一条老建议是:“安全性和正确性一样,不是附加功能。”

现在谈谈加入。如果您使用SQL,您应该了解如何进行连接。不了解SQL中的连接就像认为自己了解PHP,即使不知道如何使用
foreach()
。从技术上讲,你仍然可以做一些事情,但是你错过了语言的一个主要部分

联接允许您在一个查询中查询多个表,并从每个表中查找匹配的行

在您的示例中,我不知道您的第一个查询,但我猜它会查询其他表以获得用户名列表。可能它会查询电子邮件收件人的用户列表,如下所示:

SELECT username FROM EmailRecipients WHERE EmailId = 1234
然后,代码在第二个查询中使用用户名的结果列表。但您可以在一个查询中完成这一切:

SELECT Users.username, Users.status, Users.location
FROM Users JOIN EmailRecipients 
  ON Users.username = EmailRecipients.username
WHERE EmailRecipients.EmailId = 1234
SQL引擎搜索EmailRecipients表,并说它找到了t的六行
$conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$conn->query($sql)->fetchAll();
$conn->query($sql)->fetchAll(PDO::FETCH_NUM);