【问题标题】:php query function / classphp查询函数/类
【发布时间】:2010-08-23 09:36:52
【问题描述】:

一定是星期一,天气太热了,不然我就傻了(可能是后者),但对于我来说,我无法让一个简单的 php 函数工作。

我有一个简单的查询

$sql = mysql_query("SELECT * FROM table WHERE field_name = '$input'");

我想通过一个函数运行:说:

function functionname($input){

    global $field1;
    global $field2;
    $sql = mysql_query("SELECT * FROM table WHERE field_name = '$input'");
    while($row = mysql_fetch_array($sql)) :
    $field1[] = $row['field1'];
    $field2[] = $row['field2'];
    endwhile;   
    mysql_free_result($sql);

}

这样我就可以在许多地方使用不同的“输入”调用该函数。然后使用 foreach 循环遍历结果。

第一次调用该函数时运行良好,但之后总是出错。

正如所说的“一定是星期一,天气太热了,不然我就傻了(可能是后者)”。

请提出建议,因为我真的只想调用 1 个函数,而不是每次都重写查询。

这是错误信息

Fatal error: [] operator not supported for strings in C:\xampp\htdocs\functions.php on line 270

【问题讨论】:

  • 如果您发布错误消息的文本会很有帮助。
  • 尝试将 var_dump() 函数调用添加到函数末尾,看看全局变量会发生什么。
  • 第 270 行是哪一行代码?您很可能在调用之间使用 $field1 和/或 $field2 将它们从数组更改为另一种数据类型。在这里使用全局变量不是一个好主意,为什么不简单地在你的函数中初始化一个数组,用数据库数据填充它,然后返回数组
  • 避免使用全局变量,它们有许多讨厌的怪癖,例如您可以在此处看到:$field1 或 $field2 不是数组(它是一个字符串 somewhere;因为它是一个全局的,祝你好运找出确切的位置),并且尝试将它用作数组会给你错误。
  • 另外,当 $input = "Mr. O'Hara" 时会发生什么?清理你的 mysql 代码,或者更好的是,使用带有参数化查询的 mysqli。

标签: php sql class function


【解决方案1】:
function functionname($input){ 
    $sql = mysql_query("SELECT field1,field2 FROM table WHERE field_name = '$input'"); 
    $result = array('field1' => array()
                    'field2' => array()
                   );
    while($row = mysql_fetch_array($sql)) : 
       $result['field1'][] = $row['field1']; 
       $result['field2'][] = $row['field2']; 
    endwhile;    
    mysql_free_result($sql); 
    return $result;
} 

【讨论】:

  • 谢谢马克,像这样很容易注释(见我对 Col Shrapnel 的评论),因此你得到了他们所说的我的“投票”。
  • 对不起,这里的菜鸟:$result['field1'][] = $row['field1']; 中的空数组索引有什么作用?是否将整行分配给该数组,所以它就像 [field1][row element 1,row element 2]?
  • $result['field1'] 是一个“子数组”或嵌套数组... [] 正在向该子数组追加一个新条目
【解决方案2】:

似乎 $field1 或 $field2 在某处被转换为字符串,而您不能将 [] 应用于字符串... 我会说你必须这样做:

$field1 = array();
$field2 = array();

在 WHILE 循环之前

【讨论】:

  • 那会让全球化变得毫无意义,他还不如在函数中定义它们。
  • yeap.. 最好在这个函数之外返回值并管理全局变量
【解决方案3】:

问题是你所谓的数组是字符串!

global $field1;
global $field2;
var_dump($feild1,$feild2); //Will tell you that there strings

正确阅读错误!

字符串不支持

[]运算符

您使用[] 的唯一地方是使用$feild - X

GLOBAL 必须有效,因为错误告诉您数据类型,即字符串,因此它们必须已导入范围。


另一件事,为什么您只使用其中的 2 个时选择所有列,请将您的查询更改为:

$sql = mysql_query("SELECT feild1,feild2 FROM table WHERE field_name = '$input'");

另一件事是您使用mysql_fetch_array 女巫返回一个整数索引数组,您希望mysql_fetch_assoc 获取密钥。

while($row = mysql_fetch_assoc($sql)) :
    $field1[] = $row['field1'];
    $field2[] = $row['field2'];
endwhile;

我会做什么

function SomeFunction($variable,&$array_a,&$array_b)
{
    $sql = mysql_query("SELECT field1,field2 FROM table WHERE field_name = '$variable'");
    while($row = mysql_fetch_assoc($sql))
    {
        $array_a[] = $row['field1'];
        $array_b[] = $row['field2'];
    }
    mysql_free_result($sql);
}

然后像这样使用。

$a = array();
$b = array();
SomeFunction('Hello World',&$a,&$b);

【讨论】:

  • 它们必须是“数组”才能运行循环 - 关于如何将数组从函数中取出的任何建议,因为全局不起作用
  • 当您在函数内部对变量使用全球化时,对值所做的任何编辑都会直接影响外部变量,因此只要变量在根范围内,您应该能够在那里调用全局变量!
  • 因为这个我知道有字符串!!字符串不支持 [] 运算符
  • 更新了另一个可能导致它的数组错误!
  • 那么向我解释一下为什么php告诉用户[] operator not supported for strings
【解决方案4】:

在我看来,这是非常不寻常甚至毫无用处的方法。
此功能过于本地化。
制作通用功能会更好。

<?
function dbgetarr(){
  $a = array();
  $query = array_shift($args);
  foreach ($args as $key => $val) {
    $args[$key] = "'".mysql_real_escape_string($val)."'";
  }
  $query = vsprintf($query, $args);

  $res = mysql_query($query);
  if (!$res) {
    trigger_error("dbgetarr: ".mysql_error()." in ".$query);
    return FALSE;
  } else {
    while($row = mysql_fetch_assoc($res)) $a[]=$row;
  }
  return $a;
}

然后这样称呼它

$data = dbgetarr("SELECT field1,field2 FROM table WHERE field_name = %s",$input);
foreach ($data as $row) {
  echo $row['field1']." ".$row['field1']."<br>\n";
}

【讨论】:

  • 弹片 - 我完全同意你的 cmets “这是非常不寻常甚至无用的方法”但是..(总是有一个但是)这是一个小项目(8 个表),必须“正确注释”以一种没有知识的人可以阅读笔记并理解的方式。因此,上面描述的“个人”功能路线。就像我通常会使用的想法/方法一样(当不太热或星期一:))感谢您提供更实用的解决方案,非常感谢。
【解决方案5】:

要了解您的问题,我们需要错误,但是,您确定您以正确的方式解决此问题吗?

如果只是更改输入字段的值,为什么需要多次调用该函数?

您可以改进您的 SQL 语句以返回您第一次需要的完整结果集。即 SELECT * FROM table GROUP BY field_name;

不确定该方法是否适用于您的场景,但一般而言,您应该致力于减少到数据库的往返次数。

【讨论】:

    【解决方案6】:

    我不知道,我对与否。但我建议试试这个:

    function functionname($input){
    
        global $field1;
        global $field2;
        $sql = mysql_query("SELECT * FROM `table` WHERE `field_name` = '" . $input . "'");
        while($row = mysql_fetch_assoc($sql)) :
        $field1[] = $row['field1'];
        $field2[] = $row['field2'];
        endwhile;   
        mysql_free_result($sql);
    
    }
    

    【讨论】:

    • 感谢亚历克斯,但相同的结果只能循环遍历数组;例如
    猜你喜欢
    • 2013-07-23
    • 2011-06-04
    • 2016-01-18
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多