【发布时间】:2012-11-06 21:30:28
【问题描述】:
我有以下最终将成为网页的 perl 代码:
my($dbh) = DBI->connect("DBI:mysql:host=dbsrv;database=database","my_sqlu","my_sqlp") or die "Canny Connect";
my($sql) = "SELECT * FROM hardware where srv_name = \"$srv_name\"";
my($sth) = $dbh->prepare($sql);
$sth->execute();
$sth->bind_col( 1, \my($db_id));
$sth->bind_col( 2, \my($db_srv_name));
$sth->bind_col( 5, \my($db_site));
$sth->fetchrow();
$sth->finish ();
my($sql) = "SELECT sites.\`site_code\`, sites.\`long_name\` FROM \`hardware\` JOIN \`sites\` ON \`sites\`.id=\`hardware\`.\`site\` where \`hardware\`.\`id\`=\'$db_id\'";
my($sth) = $dbh->prepare($sql);
$sth->execute();
$sth->bind_col( 1, \my($db_site_code));
$sth->bind_col( 2, \my($db_long_name));
$sth->fetchrow();
$sth->finish ();
$dbh->disconnect;
print "$db_site_code<br>$db_long_name";
上面的查询确实有效,但是我想知道有什么方法可以运行一个 SQL 查询并从站点数据库中获取 db_site_code 和 db_long_name 而无需运行第二个查询?硬件数据库在站点数据库中有外键“id”。
当您阅读有关关系数据库的任何内容时,他们都说这是迄今为止从数据库中获取数据的最有效方法,但我只是看不出这比仅运行 2 个选择查询要快得多。我在上面所做的肯定会比"select from hardware where srv_name = $srv_name" 然后"select from sites where id = db_site_id" 花费更长的时间?非常感谢任何 cmets。
【问题讨论】:
-
在您对自己造成严重伤害之前,请花点时间在您的应用程序中使用proper SQL placeholders。
-
谢谢塔德曼。我会做。这仅适用于本地 Intranet,但我同意那里有一些邪恶的人,其中一些可能与我合作!
-
您在内网上运行的代码随时可能成为您公开运行的代码。始终保持最佳安全习惯。
-
此外,看起来最简单的用户通常会找到最奇怪的方法来获取他们通常不应该获取的数据,或者通过欺骗您的网络应用来创建“更高效”的快捷方式。
-
如果您正确地转义所有数据,任何名为“O'Malley”的人都会非常感激。
标签: mysql sql perl relationship