【发布时间】:2013-08-09 02:32:09
【问题描述】:
我将创建一个网站,该网站每天可以收到多达 6,000 个警报(这些警报包含最多 140 个字符,大约是 30 个单词令牌-)。我的问题是,如果我有一个函数来验证每个令牌是否已经在数据库中,它是假的,什么都不做,如果它是插入,等等,但是对于每个单词它必须遍历整个数据库进行检查,我应该如何处理连接?每次我需要检查单词时打开连接很糟糕?
function insertTag($tag){
$db = "test";
$user = "Eduardo";
$pass = "weaponx";
$host = "localhost";
$con = new mysqli($host, $user, $pass, $db);
$noInsert = false;
$result = $con->query("select TAG from TAGS");
$num_tags = $result->num_rows;
for($c=0; $c < $num_tags; $c++){
$row = $result->fetch_assoc();
echo "tag ". ($c+1) .": ". $row['TAG'] ."<br/>";
if ($fila['TAG'] === $tag){
echo "$tag: already exist.<br />";
$noInsert = true;
return;
}
else{
$noInsert = false;
}
}
if (!$noInsert){
$result2 = $con->query("insert into TAGS(TAG) values('$tag')");
echo "token $tag: inserted<br />";
}
}
$tags = "danger in detroit";
// insert word in the BD, only if new
for($i=0; $i < count($tags); $i++){
insertTag($tags[$i]);
}
我应该使用 mysqli 版本的持久连接吗?如果有怎么办?
【问题讨论】:
-
这是一种非常低效的查看标签是否存在的方法。你不能至少在你的 SELECT 中添加一个 WHERE 子句吗?
-
我使用单词标签是因为他们告诉我,但实际上我保存了应用程序获得的所有可能值,这就是为什么我不使用 where 子句,这就像创建字典,我能想到的唯一改进是检查单词的第一个字母并搜索它们,但我不知道如何
-
使用mysqli时,必须使用
bind_param到properly escape your values,避免严重的SQL injection bugs。您直接在查询中替换$tag,对此没有任何顾虑。 -
@WeaponX - 为每个单词执行不同的 SELECT 会更有效。一旦您的字典达到合适的大小,您每次都会检索数千个结果并循环遍历所有结果。您将进行更多查询,但每个查询最多只返回 1 行。
-
伙计们根本不需要做任何选择。
标签: php mysql mysqli database-connection