在$ _GET中存储对象

时间:2010-03-28 13:41:44

标签: php

如何在PHP中的$ _GET数组中存储对象。我想通过$ _GET数组将包含数据库信息的对象从一个页面传递到另一个页面,因此不需要再次访问数据库。

6 个答案:

答案 0 :(得分:5)

要传递任何类型的对象,您必须在一端 serialize ,并在另一端 unserialize

但请注意,这对数据库连接本身不起作用:当PHP脚本结束时,将自动关闭与数据库的连接。
你可以传递一些连接信息,比如登录,主机或像这样的东西(但这不是一个好主意 - 暴露这些关键信息是不安全的!);但是你无法传递连接资源。

答案 1 :(得分:1)

您需要将其序列化为文本(可能使用json_encode),然后生成一个包含在查询字符串中的URL(确保它是urlencoded

答案 2 :(得分:1)

实际上,如果可能的话,您应该通过$ _SESSION变量将数据从一个页面传递到另一个页面。这就是会议的目的。理想情况下,只需在会话中存储一个id,然后在每个页面上查找数据。如果你确实使用$ _SESSION那么它就像......一样简单。

$_SESSION['myarray'] = $myarrayobject;
$_SESSION['someotherthing'] = 42;

如果你必须使用$ _GET,那么我建议只传递某种类型的id,然后重新查找每页refesh上的数据。

请记住,恶意用户很容易更改通过页面之间的$ _GET发送的值,因此请确保此信息中没有任何内容可以滥用。

答案 3 :(得分:0)

这是个非常糟糕的主意 数据库是为每个请求提供服务而发明的,而查询字符串的设计只传递命令和标识符,而不是浏览器和服务器之间的大量数据

答案 4 :(得分:0)

除了使用get之外,将一些内容从一个页面传递到另一个页面的另一种可能性是使用$ _SESSION数组,然后在完成它时在另一侧取消设置该变量。我发现这是一个非常好的方法。

就像其他人所说的那样,传递数据库信息可能是一个坏主意,假设你传递的信息不是像用户名,名字等等。如果那就是当你说“数据库”时你正在传递的信息信息“然后我将所有内容存储在$ _SESSION变量中,然后在他们注销时销毁他们的会话。不要存储整个连接或其他东西。

答案 5 :(得分:0)

如前所述,您应该避免(错误地)将GET参数用作过于复杂和低数据的“缓存”。
另一方面,你的问题很模糊,可以假设你只想传输几个值。而你的“第二”脚本不需要数据库中的任何其他内容,事实上它可能甚至不必检查这些值是否来自数据库。
在这种情况下,从数据库结果中提取值,并将它们作为参数附加到url。尽量使参数列表尽可能简单但明确无误。 http_build_query()可以为您提供帮助。
但请记住,您希望保持GET操作的幂等性,如http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html中所述。

if ( isset($_GET['a'], $_GET['b'], $_GET['c']) ) {
  // this doesn't care about the values in the database at all.
  echo 'product: ', $_GET['a'] * $_GET['b'] * $_GET['c'], "\n";
}
else {
  $pdo = new PDO("mysql:host=localhost;dbname=test", 'localonly', 'localonly'); 
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  // let's make it a self-contained example (and extra constly) by creating a temproary table ...
  $pdo->exec('CREATE TEMPORARY TABLE foo (id int auto_increment, a int, b int, c int, primary key(id))');
  // ... with some garbage data
  $stmt = $pdo->prepare('INSERT INTO foo (a,b,c) VALUES (?,?,?)');
  for($i=0; $i<10; $i++) {
    $stmt->execute(array(rand(1,10), rand(1,10), rand(1,10)));
  }

  foreach( $pdo->query('SELECT a,b,c FROM foo', PDO::FETCH_ASSOC) as $row) {
    printf('<a href="?%s">%s</a><br />',
      http_build_query($row),
      join(' * ', $row)
    );
  }
}