有没有更好的方法从MySQL数据库获取项目?

时间:2011-06-11 08:51:08

标签: php mysql sql

我是SQL的新手(现在正在阅读)。我想知道在PHP中是否有更好的方法来获取MySQL数据项而不是以下内容:

$sql = "SELECT `topic_id` from `topics` WHERE `user_id` = ".$userId." AND `topic` = ".$topic.";";
$topicRow = mysql_query($sql);
$row = mysql_fetch_array($topicRow);
$topicId = $row['topic_id'];

我的意思是,创建了4个变量以获得1个项目。我做错了吗?

谢谢

3 个答案:

答案 0 :(得分:2)

vars的数量不是一个真正的问题,如果你愿意,你可以将sql-string放在你的查询中,但你并没有真正赢得任何可衡量的东西。请不要在那里寻找效率。虽然@genesis和@patapizza的答案在我看来是正确的,但它们并没有以任何方式帮助你改进你的代码,只是让它的可读性降低。

您应该查看参数化查询(请参阅使用PDO):您应该拆分内容($userId)和SQL命令。

手册中的一个例子:

$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < ? AND colour = ?');
$sth->execute(array(150, 'red'));
$red = $sth->fetchAll();

您不必逃避查询中的各种内容,因此您可以免于注射。

(ow,巧合的是,只使用了2个变量.. jeeeej :))

答案 1 :(得分:1)

除非您没有SQL转义$userId$topic,否则您的代码很容易被SQL注入。我也会使用PDO API而不是数据库管理系统。

http://php.net/manual/en/book.pdo.php

答案 2 :(得分:0)

您总是可以使用数据库抽象层,例如ADOdb

问题是,您不希望不断涉及转义变量,并且查询连接是不应该在代码中的许多地方完成的事情。拥有所有这些,你可以做的最好的事情,是真的,使用像ADOdb这样的东西,或者做一些你自己的东西,以防ADOdb不能满足你的需求。

从架构师的角度来看,将逻辑,实际程序逻辑与诸如获取数据的技术手段(开放连接,定义命令,获取结果,读取结果等)混合在一起是完全错误的。在那个逻辑中,你只需要获取数据。您不需要在逻辑中看到数据库连接。