私はPHPでのプログラミングにかなりの経験があり、データベースから情報を取得したい小さなサイドプロジェクトを作成しています
接続がオーバーフローしないように、シングルトンを使用して独自のSQLハンドラーを作成しました。
これは私のクエリ関数です:
<?php
public static function query($q){
$a = '';
$b = '';
self::$queries[] = $q;
if(strpos($q, 'INSERT') !== false){
if(!mysql_query($q)){
self::$err[] = mysql_error()."<br />Query: ".$q;
return false;
}
return true;
} elseif(strpos($q, 'SELECT') !== false){
echo $q;
if(!$res = mysql_query($q)){
self::$err[] = mysql_error()."<br />Query: ".$q;
return false;
} else {
if(mysql_num_rows($res) > 1){
while($r = mysql_fetch_assoc($res)){
foreach($r as $key => $val){
self::$results[$r['id']][$key] = $val;
}
}
return self::$results;
} else {
$res = mysql_fetch_assoc($res);
foreach($res as $key => $val){
self::$results[$res['id']][$key] = $val;
}
return self::$results;
}
}
} elseif(strpos($q, 'UPDATE') !== false){
if(!mysql_query($q)){
self::$err[] = mysql_error()."<br />Query: ".$q;
return false;
}
return true;
} elseif(strpos($q, 'DELETE') !== false){
if(!mysql_query($q)){
self::$err[] = mysql_error()."<br />Query: ".$q;
return false;
}
return true;
}
}
?>
今、私が作成したテーブルからいくつかのデータを取得したい(テーブルには2つの外部キーが含まれています) テーブル:
CREATE TABLE IF NOT EXISTS `loc_npc` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`loc_id` int(11) NOT NULL,
`npc_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `loc_id` (`loc_id`),
KEY `npc_id` (`npc_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
ALTER TABLE `loc_npc`
ADD CONSTRAINT `loc_npc_ibfk_2` FOREIGN KEY (`npc_id`) REFERENCES `npcs` (`id`),
ADD CONSTRAINT `loc_npc_ibfk_1` FOREIGN KEY (`loc_id`) REFERENCES `locations` (`id`);
このクエリを実行したときの問題SELECT id, loc_id, npc_id FROM loc_npc WHERE loc_id = 9
は、正しいデータと同様に、別のテーブルからデータが返されることです。
クエリは別のハンドラーで実行されます。
public function getLocationNpc($id){
//return $this->sql->query("SELECT e.`name`, e.`desc`, e.`id` FROM npcs e LEFT JOIN(loc_npc i CROSS JOIN locations l) ON (e.id = i.npc_id AND i.loc_id = l.id) WHERE i.loc_id = $id");
$npcH = new npcHandler();
$npcId = $this->sql->query("SELECT id, loc_id, npc_id FROM loc_npc WHERE loc_id = $id");
echo '<pre>'.print_r($npcId, true).'</pre>';
foreach($npcId as $nId){
$npcArr[] = $npcH->getNpc($nId['npc_id']);
}
return $npcArr;
}
phpmyadmin でクエリをテストしたところ、ハンドラーを介して実行されたクエリとは異なり、正しいデータが返されました。
小さくてばかげたものだと確信していますが、見つけられないようです。