【问题标题】:Use select in PHP, MySQL when I know exactly which column i need当我确切知道我需要哪一列时,在 PHP、MySQL 中使用 select
【发布时间】:2010-08-21 09:33:23
【问题描述】:

现在我使用这个代码:

$welcome_text = mysql_query("SELECT * FROM `text` WHERE `name` = 'welcome'");
while ($row = mysql_fetch_array($welcome_text, MYSQL_ASSOC)) {
 echo $row['content'];
}

如果我确切知道我需要哪一列,是否可以在没有 WHILE 的情况下使用它? 像这样的:

$welcome_text = mysql_query("SELECT 'content' FROM `text` WHERE `name` = 'welcome'");
echo $welcome_text;

谢谢

【问题讨论】:

  • 你的想法是对的。所有重复的动作都应该缩短。虽然您不能以这种方式使用本机函数,但您可以创建自己的函数。

标签: php mysql select


【解决方案1】:

mysql_query 进行查询,返回结果集。

mysql_fetch_array 从结果集中获取第一行。

$welcome_text = mysql_query("SELECT * FROM `text` WHERE `name` = 'welcome'");
$row = mysql_fetch_array($welcome_text, MYSQL_ASSOC);
echo $row['content'];

当然,您可以根据需要缩短代码,但这可能会使您的代码更难调试和维护。

冗长、清晰的代码 > 单行“炫耀”代码。

包括“以防万一”检查:

$welcome_text = mysql_query("SELECT * FROM `text` WHERE `name` = 'welcome'");
if($row = mysql_fetch_array($welcome_text, MYSQL_ASSOC)){
    echo $row['content'];
}

在打印之前双重确保您拥有所需内容的良好做法。

最后,请确保在用户提交的数据进入您的数据库之前对其进行清理。如果你不打算使用prepared statements,至少使用mysql_real_escape_string

练习安全的SQL,戴上prepared statement来防止SQL Injections

【讨论】:

  • 其实没有什么需要消毒的。可能保存数字。字符串已经没问题了,如果处理得当。这样的处理更重要的是要提到
  • @TheColonel:请原谅我的无知,你所说的“妥善处理”是什么意思?
【解决方案2】:

我会为此编写一个函数:

// Returns content of first column in first result and 
// returns null if query returns no records
function mysql_get_result($sql) {

   $query = mysql_query($sql); // you may add error handling ...
   if (mysql_num_rows($query) != 0) {
      $row = mysql_fetch_array($query, MYSQL_NUM));         
      return $row[0];
   } else {
      return null;
   }
}

现在你可以使用:

$welcome_text = mysql_get_result("SELECT `content` FROM `text` WHERE `name` = 'welcome'");

注意:您可以抛出异常而不是返回 null 值。但是哪个更好很难说,这可能取决于您的编程风格。

【讨论】:

  • 只有在查询返回 false 时才会抛出异常。虽然这样的业务逻辑问题我会以相同的业务逻辑方式处理,而不是错误处理方式。但是,是的,这取决于。
【解决方案3】:

这不完全一样。在您的第一个示例中,您正在迭代多个,而不是列。

除非您确定只有一行名称为 welcome,否则您仍然需要循环。

你是对的,当你只需要一些列时你不应该select *,这很浪费。

也就是说,你应该只使用稍作修改的:

$welcome_text = mysql_query("SELECT `content` FROM `text` WHERE `name` = 'welcome'");
while ($row = mysql_fetch_array($welcome_text, MYSQL_ASSOC)) {
    echo $row['content'];
}

【讨论】:

    【解决方案4】:
    $welcome_text = mysql_fetch_row(mysql_query("SELECT 'content' FROM `text` WHERE `name` = 'welcome'"));
    echo $welcome_text[0];
    

    【讨论】:

    • 永远不要试图把你所有的代码都塞进一行,儿子。这很愚蠢。
    • 嗯,这不是 OP 想要的吗?并不意味着这是一个好主意。
    • @EboMike 没有以 OP 的代码为借口 :) 他们正在询问,因为他们不知道正确的方法。所以,不要跟随他们的想法,而是提出更好的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2018-04-30
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多