在循环中添加到数组

时间:2011-09-19 17:53:55

标签: php arrays loops

如何将数据添加到关联数组?使用jquery我想根据密钥检索数据。

 if(isset($_POST["user_name"]))
 {  
$sql = "SELECT * FROM users WHERE user_name='".$_POST["user_name"]."' AND user_password='".$_POST["user_password"]."'";

$result = mysql_query($sql) or die(mysql_error());

$jsonresult = array();

  while($row = mysql_fetch_array($result))
  {

    $jsonresult["user_auth"] = 1;
    $jsonresult["user_id"] = $row['user_id'];
    $jsonresult["user_name"] = $row['user_name'];

    $_SESSION["user_auth"] = 1;
    $_SESSION["user_id"] = $row['user_id'];
    $_SESSION["user_name"] = $row['user_name'];
  }

  echo json_encode($jsonresult);
  mysql_close();
  }

我的问题在这里:

$jsonresult["user_auth"] = 1;
$jsonresult["user_id"] = $row['user_id'];
$jsonresult["user_name"] = $row['user_name'];

只剩下数据库的最后一行。为什么呢?

感谢您的建议。

8 个答案:

答案 0 :(得分:3)

好吧,你要覆盖这个值而不是添加一个新值。相反,为每个结果构造一个数组,并将这些数组添加到$jsonresult

另外,请务必avoid SQL Injection vulnerabilities

$sql = "SELECT * FROM users WHERE user_name='".
       mysql_real_escape_string($_POST["user_name"]) . "' AND " .
       "user_password='". mysql_real_escape_string($_POST["user_password"]) ."'";
$result = mysql_query($sql) or die(mysql_error());
// Or better yet, use PDO and prepared statements

$jsonresult = array();
while (($row = mysql_fetch_array($result)) !== false) {
  $rowresult = array();
  $rowresult["user_auth"] = 1;
  $rowresult["user_id"] = $row['user_id'];
  $rowresult["user_name"] = $row['user_name'];
  $jsonresult[] = $rowresult; // Or array_push($jsonresult, $rowresult);
  // $_SESSION stuff
}

答案 1 :(得分:2)

编辑首先,我认为您只期望一个结果,因此无需循环。

其次,您的数据库中有多少用户?你确定它每次都被设置,还是从前一次运行中残留下来?试试这个修改:

$jsonresult = array();
$_SESSION["user_auth"] = -1;
$_SESSION["user_id"] = "not";
$_SESSION["user_name"] = "set";

  while($row = mysql_fetch_array($result))
  {

    $jsonresult["user_auth"] = 1;
    $jsonresult["user_id"] = $row['user_id'];
    $jsonresult["user_name"] = $row['user_name'];

    $_SESSION["user_auth"] = 1;
    $_SESSION["user_id"] = $row['user_id'];
    $_SESSION["user_name"] = $row['user_name'];
  }

看看你是否“不”和“设定”

答案 2 :(得分:1)

使用MYSQL_ASSOC标志

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    $jsonresult[$row['user_id']]["user_auth"] = 1;
    $jsonresult[$row['user_id']]["user_id"] = $row['user_id'];
    $jsonresult[$row['user_id']]["user_name"] = $row['user_name'];

    $_SESSION[$row['user_id']]["user_auth"] = 1;
    $_SESSION[$row['user_id']]["user_id"] = $row['user_id'];
    $_SESSION[$row['user_id']]["user_name"] = $row['user_name'];
}

甚至mysql_fetch_assoc代替mysql_fetch_array,没有任何标记。

编辑:由于你的函数看起来像基本的autentification函数,我会把它改成这样的东西:

$_SESSION["user_auth"] = 0;
$jsonresult = array('user_auth'=>0);
if(isset($_POST["user_name"]) && isset($_POST["user_password"])) {
    $input = array(
        'username'=>htmlspecialchars($_POST["user_name"], ENT_QUOTES),
        'password'=>htmlspecialchars($_POST["user_password"], ENT_QUOTES)
    );
    $query = sprintf("SELECT * FROM users WHERE user_name='%s'", $input['username']);
    $result = mysql_query($query);
    if (mysql_num_rows($result) > 0) {
        $data = mysql_fetch_assoc($result);
        mysql_close();
        if ($data['user_password'] == $input['password']) {
            $jsonresult["user_auth"] = 1;
            $jsonresult["user_id"] = $data['user_id'];
            $jsonresult["user_name"] = $data['user_name'];

            $_SESSION["user_auth"] = 1;
            $_SESSION["user_id"] = $data['user_id'];
            $_SESSION["user_name"] = $data['user_name'];
        }
    }
}
echo json_encode($jsonresult);

答案 3 :(得分:0)

您必须为每一行使用一个键:

$i = 0;
while($row = mysql_fetch_array($result))
{

$jsonresult[$i]["user_auth"] = 1;
$jsonresult[$i]["user_id"] = $row['user_id'];
$jsonresult[$i]["user_name"] = $row['user_name'];

$_SESSION[$i]["user_auth"] = 1;
$_SESSION[$i]["user_id"] = $row['user_id'];
$_SESSION[$i]["user_name"] = $row['user_name'];
$i++;
}

echo json_encode($jsonresult);
mysql_close();
}

答案 4 :(得分:0)

现在,您只有一维数组。这意味着每次循环执行时,数组中的那些位置都会被最新值覆盖。你需要一个二维数组(数组数组),在你的情况下它非常简单。

变化:

$jsonresult["user_auth"] = 1;
$jsonresult["user_id"] = $row['user_id'];
$jsonresult["user_name"] = $row['user_name'];

要:

$jsonresult[$i]["user_auth"] = 1;
$jsonresult[$i]["user_id"] = $row['user_id'];
$jsonresult[$i]["user_name"] = $row['user_name'];

答案 5 :(得分:0)

另一种方法是将您的查询更改为仅选择您需要的字段(确保您清理用户输入!):

SELECT 1 as user_auth, user_id, user_name FROM...

初始化数组:

$result = array();

然后使用mysql_fetch_assoc

while(($row = mysql_fetch_assoc($result))) {
    $result[] = $row;
}
$_SESSION['users'] = $result;

 echo json_encode($result);

更新:正如@Robert已经提到的那样,实际上你应该只得到一个结果,所以不需要循环。

答案 6 :(得分:0)

你的代码对我没用。
以下看似够了

if(isset($_POST["user_name"])) {  
  $name = mysql_real_escape_string($_POST["user_name"]);
  $pass = mysql_real_escape_string($_POST["user_password"]);
  $sql  = "SELECT user_id,user_name FROM users WHERE user_name='$name' AND user_password='$pass'";
  $res  = mysql_query($sql) or trigger_error(mysql_error());
  $row  = mysql_fetch_assoc($result);

  $_SESSION["user_id"]   = $row['user_id'];
  $_SESSION["user_name"] = $row['user_name'];

  echo json_encode($row);
}

答案 7 :(得分:-1)

$i=0;

while($row = mysql_fetch_array($result))
{

$jsonresult[$i]["user_auth"] = 1;
$jsonresult[$i]["user_id"] = $row['user_id'];
$jsonresult[$i]["user_name"] = $row['user_name'];

$_SESSION[$i]["user_auth"] = 1;
$_SESSION[$i]["user_id"] = $row['user_id'];
$_SESSION[$i]["user_name"] = $row['user_name'];
$i++;
}