3

我只是想知道是否有任何方法可以使用WHERE子句中的主键选择一行,而不必知道键列的名称。

我建议的 PHP 函数如下:

function getData($table,$key,$asarray=false) {
    $sql = mysql_query("select * from `".$table."` where primary='".$key."'");
    if( !$asarray) return mysql_fetch_assoc($sql);
    $ret = [];
    while($row = mysql_fetch_assoc($sql)) $ret[] = $row;
    return $ret;
}

几点注意事项:

  1. $table仅来自代码内部的文字字符串,绝不来自外部来源。
  2. 出于此问题的目的,假设$key已正确转义。
  3. 我不在乎mysqlPHP 5.5 中已弃用,因为我使用的是 PHP 5.4
  4. 出于同样的原因,这$ret = []是定义数组的一种完全有效的方法——我这样说是因为在我的最后一个问题中,人们告诉我,由于这种语法,我的代码无法正常工作。

现在,我当前的实际工作代码有一个关联数组,将表名映射到它们对应的主键字段名。我只是想知道是否有一种自动化的方法可以做到这一点,最好是不涉及查询的方法INFORMATION_SCHEMASHOW CREATE TABLE或者SHOW INDEXES.

4

3 回答 3

2

不,在不知道或查询主键列的情况下,没有自动化的方法可以做到这一点。

请注意,主键可能不止一列!

我在 Zend Framework 1.0 中实现了这种通用的 find-by-primary-key 方法。我们必须为表网关类编写代码来发现表的主键和所有其他列。

DESC用作更快的替代方法或SHOW CREATE TABLE查询INFORMATION_SCHEMA. 这些SHOW命令只是映射到针对 的查询INFORMATION_SCHEMA,这可能会产生很高的成本,因为它会触发 InnoDB 表重新读取表的一部分以刷新内存中的统计信息(除非您设置 innodb_stats_on_metadata=0)。

于 2013-01-14T00:00:15.623 回答
2

这将需要再次调用 mysql 服务器,但这应该可以为您提供所需的内容:

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY'
于 2013-01-14T00:02:04.327 回答
1

我将 Zend Framework 1 用于此类事情。

只需从 Zend_Db_Table 对象执行 find() 并传递您想要的键,如下所示:

$table = new Zend_Db_Table($table);
$rows = $table->find($key);
于 2013-01-14T00:20:56.007 回答