Php 一行中的Mysqli查询

Php 一行中的Mysqli查询,php,mysql,sql,variables,mysqli,Php,Mysql,Sql,Variables,Mysqli,我当前用于运行简单SQL查询的过程如下所示: $a = $mysqli->query("SELECT column FROM table"); $b = $a->fetch_assoc(); $c = $b["column"]; 这使用了3个不同的变量名,试图找到合适的名称会让人沮丧。 我认为在程序风格中,我可以将其分为两行,而不是三行: $a = mysql_fetch_assoc(mysql_query("SELECT column FROM table")); $b = $a

我当前用于运行简单SQL查询的过程如下所示:

$a = $mysqli->query("SELECT column FROM table");
$b = $a->fetch_assoc();
$c = $b["column"];
这使用了3个不同的变量名,试图找到合适的名称会让人沮丧。 我认为在程序风格中,我可以将其分为两行,而不是三行:

$a = mysql_fetch_assoc(mysql_query("SELECT column FROM table"));
$b = $a["column"];

有什么方法可以在一行代码中使用面向对象的样式吗?

没有什么可以阻止您使用表单

$mysqli->query($query)->fetch_assoc()["column"];
典型的名称是:

  • $a
    --
    $result
  • $b
    --
    $row
  • $c
    --
    $column

您应该在获取()之前检查此查询

我建议使用以下方法:

    $query = mysql_query("SELECT column FROM table");
    if ($query)
    {
       $data = mysql_fetch_assoc($query);
    }
    else
    {
     echo mysql_error($query);
    }

如果您将使用一行mysql查询获取结果,那么如果查询失败,您的调试就会出现问题。

为什么不使用您已经在使用的OOP?如果我没弄错的话,你可以使用立面设计模式。这不完全是一行代码,但更像是一次编写

创建一个对象来执行查询


//This is just a rough idea
class SimpleQuery {

    protected $mysqli;

    function __construct() {
       //Get a connection using whatever way you want
    }

    /**
     * @param string $query The query to execute
     * @param string $field The field to return(optional)
     * @return mixed
     */
    function query($query, $field = NULL) {

      $a = $this->mysqli->query($query);
      $b = $a->fetch_assoc($a);

      //Obviously this function needs to be adjusted to do what you seek, get multiple rows perhas
      if ($field) {
         return $b[$field];
      } else {
         return $b;
      }

    }

}

然后你可以简单地:



$simpleQuery = new SimpleQuery();

$dbData = $simpleQuery->query('SELECT column FROM table','column');

不知道这对你是否有效,但值得一写。创建对象的原因,以便可重用。:-)

是否有任何方法可以在一行代码中使用面向对象风格

当然可以。
这正是面向对象风格的用意。

但是,您不太了解面向对象样式的概念。
实际上,我们的想法并不是将一些OO方法组合在一起以获得一些笨拙且不可靠的构造,而是创建一个类,该类将具有满足您所有需要的方法。

@Touch的回答绝对正确,但当然这只是一个草图。必须对此类进行扩展,以获得所需的所有方法:

比如说,要从表中获得一列

$a = $db->getOne("SELECT column FROM table LIMIT 1");
或者要得到一整排:

$row = $db->getRow("SELECT * FROM table LIMIT 1");
还是所有的行

$data = $db->getAll("SELECT * FROM table");
您可能会注意到,这些代码段不仅比其他答案中愚蠢的方法要短,而且已经实现了错误报告、查询日志记录、分析和许多其他有用的功能

您还应该考虑到,占位符支持是必须的否则所有这些东西都将毫无用处。请注意,专用的基于OO的解决方案是将代码保存在一行中的唯一方法:使用原始API方法,您将不会得到一行,而是至少有十几行

但这样的类可以保留一行代码:

$name = $db->getOne('SELECT name FROM table WHERE id = ?i',$_GET['id']);
$data = $db->getInd('id','SELECT * FROM ?n WHERE id IN ?a','table', array(1,2));
$data = $db->getAll("SELECT * FROM ?n WHERE mod=?s LIMIT ?i",$table,$mod,$limit);

,您已经可以使用了。

这不是一个好主意,因为即使mysql\u查询失败,它也会尝试执行mysql\u fetch\u assoc,并且会使错误检查更加困难。您还应该远离不推荐使用的mysql_*函数,转而使用PDO或mysqli,以确保您的代码仍能在未来版本的PHP中使用。通常的模式是
prepare
bind
execute
,其中
bind
调用仅在您有值要添加到查询时才相关。把这个放在一条线上是鲁莽的,你做了太多的假设。PDO有一种抛出异常的模式,如果您喜欢这种样式,可能值得使用,因为错误会冒出来,而在这里您完全忽略返回代码。我尝试了您上面写的内容,但它不起作用,它返回了最后一部分的错误:Parse error:syntax error,意外的“[”仅在php5.4上…$var=$mysqli->query($query)->fetch_assoc();$var[“column”]虽然这实现了目标,但它也引入了一个包装类,它掩盖了实际发生的事情。从这个角度来看,这是一个坏主意。相反,这样的包装类是对给定问题的唯一正确答案。@ZombieHunter这只是一个关于如何进行的粗略描述。可以做很多事情来改进它。我只是保持我的状态不在OP提供的代码范围内。@ZombieHunter我认为不太好。例如,我认为重复两次列名没有任何意义。事实上,我非常喜欢这个。这是给出的最佳答案,经过一些调整和错误捕捉,它可能是一个很好的替代方案。非常感谢!有趣的想法,尽管可能有点太复杂了r我想做什么。如果你要从头开始写这整件事,这确实很复杂。但幸运的是,它已经写好了。你可以下载它,然后在一秒钟内开始使用一行。尽管你似乎选择从头开始写。祝你好运,快乐。