Php 一行中的Mysqli查询
我当前用于运行简单SQL查询的过程如下所示: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
$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我想做什么。如果你要从头开始写这整件事,这确实很复杂。但幸运的是,它已经写好了。你可以下载它,然后在一秒钟内开始使用一行。尽管你似乎选择从头开始写。祝你好运,快乐。