function getRoleNameFromType($type) { $sql = "SELECT code, title_ja, title_en FROM role WHERE type='".$type."' ORDER BY code;"; return $this->arrayFromSql($sql, USE_CACHE); } function quituser($user) { $sql = "UPDATE users SET email = '***".$user['email']."***".date("Y-m-d H:i:s")."***', active = 'f', last_modified = now() WHERE code = '".(int)$user['code']."';"; $sql .= "DELETE FROM cookie WHERE code_user = '".(int)$user['code']."'; "; return $this->exec($sql); } function resetPassword($codeUser) { $chars = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnopqrstuvwxyz23456789'; $max = strlen($chars); $pw = ''; mt_srand ((float)microtime() * 1000000); for($i=0;$i<8;$i++){ $pw .= $chars[mt_rand(0, $max-1)]; } $encoded_pw = $this->encoding_pw($pw); $sql = "UPDATE users SET pw = '".$encoded_pw."', last_modified = now() WHERE code = '".(int)$codeUser."';"; if($this->exec($sql)){ return $pw; }else{ return false; } } function checkUserFromCookie($cookie) { if(isset($cookie[COOKIE_AUTH]) && ($cookie[COOKIE_AUTH] != '')){ $user = $this->userFromCookieToken($cookie[COOKIE_AUTH]); // ログインしてない if($user == false) return false; // アクティベートしてない if(strlen($user['scrambled'])) return false; // パスワードが変更されているじゃないか! if($this->encoding_auth_token($user['pw'], $user['code']) != $cookie[COOKIE_AUTH]) return false; // OKなので users.codeを返す return $user['code']; } return false; } function userFromCookieToken($cookie) { $sql = "SELECT u.* FROM users u LEFT JOIN cookie c ON u.code = c.code_user "; $sql .= "WHERE c.token = '".$cookie."'; "; $rows = $this->arrayFromSql($sql); if(count($rows)==0) return false; return $rows[0]; } function cookieFromToken($token) { $sql = "SELECT * FROM cookie WHERE token = '". addslashes($token). "'; "; return $this->arrayFromSql($sql, NOT_USE_CACHE); } function deleteCookieFromCode($code_user) { $sql = "DELETE FROM cookie WHERE code_user = ". (int)$code_user. "; "; return $this->exec($sql); } function setTokenToCookieFromUserCode($code_user, $token) { if($this->deleteCookieFromCode($code_user)){ $sql = "INSERT INTO cookie (code_user, token, ipaddr) VALUES ('". addslashes($code_user). "', '". addslashes($token). "', '". $_SERVER['REMOTE_ADDR']. "'); "; return $this->exec($sql); } return false; } function scrambled() { $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $max = strlen($chars); $pw = ''; mt_srand ((float)microtime() * 1000000); for($i=0;$i<24;$i++){ $pw .= $chars[mt_rand(0, $max-1)]; } return $pw; } function encoding_pw($pw) { return md5($pw.'jpitch-unijapan'); } function encoding_auth_token($pw,$code) { return md5($pw.$code.$_SERVER['HTTP_HOST']); } /* function registUserAccount($P, $acount_level=ACCOUNT_LEVEL_PUBLIC) { $P = $this->sanitize($P); foreach($P as $k=>$v) $P[$k] = trim($v); $scrambled = $this->scrambled(); $pw = $this->encoding_pw($P['PW']); $sql = "INSERT INTO users (email, pw, handle, account_level, country, scrambled) VALUES ". "('".$P['EMAIL']."', '".$pw."', '".$P['HANDLE']."', '".$acount_level."', '".$P['COUNTRY']."', '".$scrambled."' );"; if($this->exec($sql)) return $scrambled; return false; } */ function registerUserAccount($P, $account_level=ACCOUNT_LEVEL_PUBLIC) { global $gLang; $P = $this->sanitize($P); $scrambled = $this->scrambled(); $pw = $this->encoding_pw($P['PW']); $sql = "SELECT nextval('users_code_seq');"; $code = $this->getOne($sql); $handle = 'UJID'.str_pad($code, 6, '0', STR_PAD_LEFT); $name = $P['LAST_NAME'].' '.($P['MIDDLE_NAME']?" ".$P['MIDDLE_NAME']:'').$P['FIRST_NAME']; // country は users_profile へ、company は users_organization_info へ $sql = "INSERT INTO users (code, email, pw, handle, name, company, account_level, country, scrambled, opt_in, lang) VALUES ". "('".$code."', '".$P['EMAIL']."', '".$pw."', '".$handle."', '".$name."', '".$P['ORG_NAME']."', '".$account_level."', '".$P['COUNTRY']."', '".$scrambled."', '".($P['OPT_IN']?TRUE:FALSE)."', '".$gLang."' );"; if($this->exec($sql)) return array($code, $scrambled); return false; } function insertUserProfile($codeUsers, $P) { // $this->registerUserAccount で既にサニタイズされてるはず // 個別に呼び出すときはサニタイズして渡すこと /* birth_year, birth_month, birth_day, */ /* '".$P['BIRTH_YEAR']."', '".$P['BIRTH_MONTH']."', '".$P['BIRTH_DAY']."',*/ $sql = "INSERT INTO users_profile ( code_users, type, first_name, last_name, middle_name, first_name_kana, last_name_kana, middle_name_kana, sex, country, industry, occupation, purpose, reference ) VALUES ( '".(int)$codeUsers."', '".$P['USER_TYPE']."', '".$P['FIRST_NAME']."', '".$P['LAST_NAME']."', '".$P['MIDDLE_NAME']."', '".$P['FIRST_NAME_KANA']."', '".$P['LAST_NAME_KANA']."', '".$P['MIDDLE_NAME_KANA']."', '".$P['SEX']."', '".$P['COUNTRY']."', '".$P['INDUSTRY']."', '".$P['OCCUPATION']."', '".$P['PURPOSE']."', '".$P['REFERENCE']."' );"; return $this->exec($sql); } function insertUserOrganizationInfo($codeUsers, $P) { // $this->registerxphpUserAccount で既にサニタイズされてるはず // 個別に呼び出すときはサニタイズして渡すこと $sql = "INSERT INTO users_organization_info ( code_users, name, dept, zip_code, address, tel, fax, url ) VALUES ( '".(int)$codeUsers."', '".$P['ORG_NAME']."', '".$P['DEPT_NAME']."', '".$P['ZIPCODE']."', '".$P['ADDRESS']."', '".$P['TEL']."', '".$P['FAX']."', '".$P['URL']."' );"; return $this->exec($sql); } function registerUser($P, $account_level=ACCOUNT_LEVEL_PUBLIC) { $res1 = $res2 = TRUE; $this->begin(); list($code, $scrambled) = $this->registerUserAccount($P, $account_level); if($code>0){ $res1 = $this->insertUserProfile($code, $P); if($P['USER_TYPE'][0]!='1'){ $res2 = $this->insertUserOrganizationInfo($code, $P); } if($res1==TRUE && $res2==TRUE){ $this->commit(); return $scrambled; } } // 登録失敗 $this->abort(); return FALSE; } function getUserFromEmail($email, $cache=USE_CACHE) { $sql = "SELECT * FROM users WHERE email = '".$this->sanitize($email)."' AND scrambled IS NULL AND active = 't';"; $rows = $this->arrayFromSql($sql, $cache); if(count($rows)!=1) return false; return $rows[0]; } function getUserFromCode($code, $cache=USE_CACHE) { $sql = "SELECT * FROM users WHERE code = '".$this->sanitize($code)."' AND scrambled IS NULL AND active = 't';"; $rows = $this->arrayFromSql($sql, $cache); if(count($rows)!=1) return false; return $rows[0]; } function getUserFromScrambled($scrambled) { if(!strlen($scrambled)) return false; $sql = "SELECT * FROM users WHERE scrambled = '".$scrambled."';"; $rows = $this->arrayFromSql($sql, NOT_USE_CACHE); if(count($rows)!=1) return false; return $rows[0]; } function activateUserAccountFromCode($code) { $sql = "UPDATE users SET scrambled = NULL, last_modified = now() WHERE code = '".$code."';"; return $this->exec($sql); } function getCountryCode() { $sql = "SELECT name_en, name_ja, num, alpha2 FROM country ORDER BY name_en;"; return $this->arrayFromSql($sql, USE_CACHE); } function updateLastAccess($codeUsers) { if((int)$codeUsers<=0) return false; $sql = "UPDATE users SET last_access = now() WHERE code = '".(int)$codeUsers."';"; return $this->exec($sql); } function updateUserAccount($P, $account_level=ACCOUNT_LEVEL_PUBLIC) { global $gLang, $gUser; $P = $this->sanitize($P); $scrambled = $this->scrambled(); $pw = $this->encoding_pw($P['PW']); $name = $P['LAST_NAME'].' '.($P['MIDDLE_NAME']?" ".$P['MIDDLE_NAME']:'').$P['FIRST_NAME']; // country は users_profile へ、company は users_organization_info へ $sql = "UPDATE users SET "; if($P['EMAIL']) $sql .= "email = '".$P['EMAIL']."', "; if($P['PW']) $sql .= "pw = '".$pw."', "; $sql .= "name = '".$name."', "; $sql .= "company = '".$P['ORG_NAME']."', "; $sql .= "country = '".$P['COUNTRY']."', "; // $sql .= "scrambled = '".$scrambled."', "; $sql .= "opt_in = '".(($P['OPT_IN']=='1')?'t':'f')."'"; $sql .= " WHERE code = '".$gUser['code']."';"; if($this->exec($sql)) return array($gUser['code'], $scrambled); return false; } function updatetUserProfile($codeUsers, $P) { // $this->registerUserAccount で既にサニタイズされてるはず // 個別に呼び出すときはサニタイズして渡すこと /* birth_year = '".$P['BIRTH_YEAR']."', birth_month = '".$P['BIRTH_MONTH']."', birth_day = '".$P['BIRTH_DAY']."', */ $sql = "UPDATE users_profile SET type = '".$P['USER_TYPE']."', first_name = '".$P['FIRST_NAME']."', last_name = '".$P['LAST_NAME']."', middle_name = '".$P['MIDDLE_NAME']."', first_name_kana = '".$P['FIRST_NAME_KANA']."', last_name_kana = '".$P['LAST_NAME_KANA']."', middle_name_kana = '".$P['MIDDLE_NAME_KANA']."', sex = '".$P['SEX']."', country = '".$P['COUNTRY']."', industry = '".$P['INDUSTRY']."', occupation = '".$P['OCCUPATION']."' WHERE code_users = '".$codeUsers."';"; return $this->exec($sql); } function updateUserOrganizationInfo($codeUsers, $P) { // $this->registerUserAccount で既にサニタイズされてるはず // 個別に呼び出すときはサニタイズして渡すこと $sql = "UPDATE users_organization_info SET name = '".$P['ORG_NAME']."', dept = '".$P['DEPT_NAME']."', zip_code = '".$P['ZIPCODE']."', address = '".$P['ADDRESS']."', tel = '".$P['TEL']."', fax = '".$P['FAX']."', url = '".$P['URL']."' WHERE code_users = '".$codeUsers."';"; return $this->exec($sql); } function updateUser($P, $account_level=ACCOUNT_LEVEL_PUBLIC) { global $gUser; if((int)$gUser['code']<=0) return FALSE; $res1 = $res2 = TRUE; $this->begin(); list($code, $scrambled) = $this->updateUserAccount($P, $account_level); if($code>0){ $res1 = $this->updatetUserProfile($gUser['code'], $P); $res2 = $this->updaTEUserOrganizationInfo($gUser['code'], $P); if($res1==TRUE && $res2==TRUE){ $this->commit(); return $scrambled; } } // 登録失敗 $this->abort(); return FALSE; } function emailDuplicateCheck($email) { $sql = "SELECT count(code) FROM users WHERE email = '".$this->sanitize($email)."'; "; return ($n = $this->getOne($sql)) ? TRUE : FALSE; }/* function getCompanyType() { $sql = "SELECT type, count(code) FROM company WHERE type!='MOVIE' AND domestic='$domestic' GROUP BY type ORDER BY count DESC;"; return $this->arrayFromSql($sql); } */ function getCompanyFromCode($codeCompany) { $sql = "SELECT * FROM company WHERE active = 't' AND code = '".(int)$codeCompany."'; "; return ( $rows = $this->arrayFromSql($sql, USE_CACHE) ) ? $rows[0] : false; } function getCompany($npp, $page) { $offset = $npp * ($page-1); $sql = "SELECT count(code) FROM company WHERE active = 't' AND as_contact = 't';"; $total = $this->getOne($sql); $sql = "SELECT * FROM company WHERE active = 't' AND as_contact = 't' "; $sql .= " ORDER BY name_yomi ASC "; $sql .= " LIMIT ".(int)$npp ." OFFSET ".(int)$offset."; "; $rows = $this->arrayFromSql($sql, USE_CACHE); return array($total, $rows); } function searchCompany($keys, $npp, $page, $type) { $offset = $npp * ($page-1); // $kw = explode(' ', mb_ereg_replace("[  ]+", ' ', addslashes(trim($keys)))); if(is_array($type)){ foreach($type as $t){ if($t=='PRODUCTION') $as_query[] = " as_production = 't' "; if($t=='DISTRIBUTORS') $as_query[] = " as_distributor = 't' "; if($t=='COMMISSIONS') $as_query[] = " as_commission = 't' "; if($t=='ASSOCIATIONS') $as_query[] = " as_association = 't' "; if($t=='ANIMATION') $as_query[] = " as_animation = 't' "; if($t=='FESTIVALS') $as_query[] = " as_festival = 't' "; if($t=='SCHOOLS') $as_query[] = " as_school = 't' "; if($t=='EQUIPMENT') $as_query[] = " as_equipment = 't' "; if($t=='FUNDS') $as_query[] = " as_fund = 't' "; if($t=='SALES') $as_query[] = " as_sales = 't' "; if($t=='CASTING') $as_query[] = " as_casting = 't' "; if($t=='SUBTITLE') $as_query[] = " as_subtitle = 't' "; if($t=='TRANSLATION') $as_query[] = " as_translation = 't' "; } } if($keys){ $querys = $this->wordageSearchKeys($keys); $searchTargets = array('name_ja', 'name_en', 'name_yomi'); foreach($querys as $q){ foreach($searchTargets as $st){ $c_sql[] = "( SELECT c.* FROM company c WHERE active = 't' AND as_contact != 't' AND c.".$st." @@ '*D+ ".$q."' ".(($as_query)?(" AND (".join(" OR ", $as_query).')'):'').")"; $c_sql[] = "( SELECT c.* FROM company c WHERE active = 't' AND as_contact != 't' AND c.".$st." ~* '".$q."' ".(($as_query)?(" AND (".join(" OR ", $as_query).')'):'').")"; } } }else{ $c_sql[] = "( SELECT c.* FROM company c WHERE c.active = 't' AND c.as_contact != 't' ".(($as_query)?(" AND (".join(" OR ", $as_query).') '):'').")"; } $union_sql = join(" UNION ALL ", $c_sql); $total_sql = "SELECT count(t1.code) FROM (SELECT DISTINCT ON (u.code) u.code FROM ( ".$union_sql.") as u) as t1;"; $total = $this->getOne($total_sql); $row_sql = "SELECT t1.* FROM ( SELECT DISTINCT ON (u.code) u.* FROM ( ".$union_sql.") as u ) as t1 ORDER BY t1.name_en LIMIT ".(int)$npp ."OFFSET ". (int)$offset."; "; $rows = $this->arrayFromSql($row_sql); return array($total, $rows); /* $sql = "SELECT count(code) FROM company WHERE active = 't' AND as_contact != 't'"; $sql .= ($key_query) ? ' AND '. $key_query : ''; $sql .= ($query) ? " AND (".join(" OR ", $query).") " : ''; $sql .= ";"; $total = $this->getOne($sql); $sql = "SELECT * FROM company WHERE active = 't' AND as_contact != 't' "; $sql .= ($query) ? " AND (".join(" OR ", $query).") " : ''; $sql .= ($key_query) ? ' AND '. $key_query : ''; $sql .= " ORDER BY name_yomi ASC "; $sql .= " LIMIT ".(int)$npp ." OFFSET ".(int)$offset."; "; $rows = $this->arrayFromSql($sql, USE_CACHE); return array($total, $rows); */ } function getContactType($domestic='t') { $sql = "SELECT type, count(code) FROM contact WHERE type!='MOVIE' AND domestic='$domestic' GROUP BY type ORDER BY count DESC;"; return $this->arrayFromSql($sql); } function getContact($npp, $page, $domestic='t') { $offset = $npp * ($page-1); $sql = "SELECT count(code) FROM contact WHERE domestic='$domestic'; "; $total = $this->getOne($sql); $sql = "SELECT * FROM contact WHERE domestic='$domestic' "; $sql .= " ORDER BY code ASC "; $sql .= " LIMIT ".(int)$npp ." OFFSET ".(int)$offset."; "; $rows = $this->arrayFromSql($sql, USE_CACHE); return array($total, $rows); } function getContactFromType($type, $npp=25, $page=1, $domestic='t') { $offset = $npp * ($page-1); $sql = "SELECT count(code) FROM contact WHERE type='$type' AND domestic='$domestic'; "; $total = $this->getOne($sql); $sql = "SELECT * FROM contact WHERE type='$type' AND domestic='$domestic' "; $sql .= " ORDER BY code ASC "; $sql .= " LIMIT ".(int)$npp ." OFFSET ".(int)$offset."; "; $rows = $this->arrayFromSql($sql, USE_CACHE); return array($total, $rows); } function getContactFromCode($code, $use_cache=USE_CACHE) { $sql = "SELECT * FROM contact WHERE active = 't' AND code = '".(int)$code."'; "; if( $rows = $this->arrayFromSql($sql, $use_cache)){ return $rows[0]; } return FALSE; } /* function getContactFromMovieKey($movie_key) { $sql = "SELECT c.* FROM contact c "; $sql .= " WHERE c.movie_key = '".$movie_key."'"; $sql .= " ORDER BY c.domestic; "; return $this->arrayFromSql($sql, USE_CACHE); } */ function getContactFromMovieKey($movie_key, $domestic='t') { $sql = "SELECT c.*, l.priority, l.memo_ja, l.memo_en FROM linkage l LEFT JOIN company c ON l.code_company = c.code "; $sql .= " WHERE l.movie_key = '".$movie_key."' AND code_company > 0 "; $sql .= " ORDER BY l.priority; "; return $this->arrayFromSql($sql, USE_CACHE); } function getFesList() { $sql = "SELECT * FROM fes ORDER BY priority; "; return $this->arrayFromSql($sql); } function insertFes($title_ja, $title_en) { $sql = 'SELECT max(priority) FROM fes; '; $n = $this->getOne($sql); $sql = 'INSERT INTO fes (title_ja, title_en, priority) '; $sql .= "VALUES ('".$this->sanitize(addslashes($title_ja))."','".$this->sanitize(addslashes($title_en))."', '".($n+1)."'); "; return $this->exec($sql); } function updateFesList($fesArray) { $sql = ''; $i = 0; foreach($fesArray as $a){ $sql .= "UPDATE fes SET title_ja = '".$this->sanitize(addslashes($a['FES_TITLE_JA']))."', title_en = '".$this->sanitize(addslashes($a['FES_TITLE_EN']))."', priority = '".$i."' WHERE code = '".$a['FES_CODE']."'; "; $i++; } return $this->exec($sql); } function getGenreFromMovieKey($key) { $sql = "SELECT g.* FROM genre g LEFT JOIN linkage l ON g.code = l.code_genre "; $sql .= "WHERE movie_key = '".$key."';"; return $this->arrayFromSql($sql); } function getGenreList($layer=GENRE_TYPE_GENRE) { $sql = "SELECT * FROM genre WHERE layer='".(int)$layer."' ORDER BY priority; "; return $this->arrayFromSql($sql); } function getGenreListWithCount($layer=GENRE_TYPE_GENRE) { $sql = "SELECT g.code, g.title_ja, g.title_en, count(l.code) FROM genre g "; $sql .= " LEFT JOIN linkage l ON g.code = l.code_genre "; if($layer>0) $sql .= " WHERE g.layer='".(int)$layer."' "; $sql .= " GROUP BY g.code, g.priority, g.title_ja, g.title_en ORDER BY g.priority; "; return $this->arrayFromSql($sql, USE_CACHE); } function getAllGenreList() { $sql = "SELECT * FROM genre ORDER BY layer, priority; "; return $this->arrayFromSql($sql); } function insertGenre($title_ja, $title_en, $layer=GENRE_TYPE_GENRE) { global $gUser; $sql = 'SELECT max(priority) FROM genre; '; $n = $this->getOne($sql); $sql = 'INSERT INTO genre (layer, title_ja, title_en, priority, created_by, last_modified_by) '; $sql .= "VALUES ('".(int)$layer."', '".$this->sanitize($title_ja)."','".$this->sanitize($title_en)."', '".($n+1)."', '".(int)$gUser['code']."', '".(int)$gUser['code']."'); "; return $this->exec($sql); } function updateGenreList($genreArray, $layer=GENRE_TYPE_GENRE) { $sql = ''; $i = 0; foreach($genreArray as $a){ $sql .= "UPDATE genre SET title_ja = '".$this->sanitize($a['GENRE_TITLE_JA'])."', title_en = '".$this->sanitize($a['GENRE_TITLE_EN'])."', priority = '".$i."' WHERE layer='".$layer."' AND code = '".$a['GENRE_CODE']."'; "; $i++; } return $this->exec($sql); } function insertLinkage2Genre($movie_key, $genreArray) { $this->begin(); $sql = "DELETE FROM linkage WHERE code_genre > 0 AND movie_key = '".$movie_key."'; "; foreach($genreArray as $code_genre){ $sql .= "INSERT INTO linkage (movie_key, code_genre) VALUES ('".$movie_key."', '".$code_genre."'); "; } if( $this->exec($sql) ){ $this->end(); return true; }else{ $this->abort(); return false; } } function deleteGenreFromCode($code) { if($code<=0) return FALSE; $sql = "DELETE FROM genre WHERE code = '".(int)$code."'; "; return $this->exec($sql); } function getImgsFromMovieKey($key) { $sql = "SELECT * FROM imgs WHERE movie_key = '".$key."' AND path != '' AND active = 't' AND public = 't' ; "; return $this->arrayFromSql($sql, USE_CACHE); } function getUrlFromMovieKey($movie_key) { $sql = "SELECT * FROM url WHERE movie_key = '".$this->sanitize($movie_key)."' AND active = 't'; "; return $this->arrayFromSql($sql); } function getJFDBTopMovie() { $sql = "SELECT * FROM movie WHERE active='t' AND top = 't'; "; return $this->arrayFromSql($sql, USE_CACHE); } function getNofMovies() { $sql = "SELECT count(code) FROM movie;"; return $this->getOne($sql); } function getMovieFromDFJ($limit=25, $page=1) { $offset = $limit*($page-1); $sql = "SELECT count(key) FROM movie WHERE as_dfj = 't'; "; $total = $this->getOne($sql); $sql = "SELECT * FROM movie WHERE as_dfj = 't' ORDER BY production_year DESC LIMIT ".(int)$limit. " OFFSET ". (int)$offset."; "; $rows = $this->arrayFromSql($sql, USE_CACHE); return array($total, $rows); // // return $this->getMovieList($limit, $page, " as_dfj = 't' "); } function getMovie($limit=25, $page=1) { return $this->getMovieList($limit, $page); } function getMovieList($limit=25, $page=1, $opt='') { $offset = $limit*($page-1); $sql = "SELECT count(key) FROM movie WHERE active='t'"; if($opt) $sql .= ' AND '.$opt; $sql .= ';'; $total = $this->getOne($sql); $sql = "SELECT * FROM movie WHERE active='t' ".(($opt)?'AND'.$opt:'')." ORDER BY production_year DESC LIMIT ".(int)$limit. " OFFSET ". (int)$offset."; "; $rows = $this->arrayFromSql($sql, USE_CACHE); return array($total, $rows); } function getRecentMovies($limit=5, $offset=0) { $sql = "SELECT * FROM movie WHERE active='t' ORDER BY release_year DESC, release_month DESC, release_day DESC LIMIT ".(int)$limit. " OFFSET ". (int)$offset."; "; return $this->arrayFromSql($sql, USE_CACHE); } function getMovieFromYear($year, $limit=25, $offset=0) { if($year<=1900) return FALSE; $sql = "SELECT count(key) FROM movie WHERE active='t' AND release_year = '".$year."'; "; $total = $this->getOne($sql); $sql = "SELECT * FROM movie WHERE active='t' AND release_year = '".$year."' ORDER BY production_year DESC LIMIT ".(int)$limit. " OFFSET ". (int)$offset."; "; $rows = $this->arrayFromSql($sql, USE_CACHE); return array($total, $rows); } function getMoviesFromProductionYear($year, $limit=25, $offset=0) { if($year<=1900) return FALSE; $sql = "SELECT count(key) FROM movie WHERE active='t' AND production_year = '".$year."'; "; $total = $this->getOne($sql); $sql = "SELECT * FROM movie WHERE active='t' AND production_year = '".$year."' LIMIT ".(int)$limit. " OFFSET ". (int)$offset."; "; $rows = $this->arrayFromSql($sql, USE_CACHE); return array($total, $rows); } function getMoviesFromReleaseYear($year, $limit=25, $offset=0) { if($year<=1900) return FALSE; $sql = "SELECT count(key) FROM movie WHERE active='t' AND release_year = '".$year."'; "; $total = $this->getOne($sql); $sql = "SELECT * FROM movie WHERE active='t' AND release_year = '".$year."' LIMIT ".(int)$limit. " OFFSET ". (int)$offset."; "; $rows = $this->arrayFromSql($sql, USE_CACHE); return array($total, $rows); } function getMovieFromIndexCharEn($char, $limit=25, $offset=0) { if(strlen($char)==0) return FALSE; $sql = "SELECT count(key) FROM movie WHERE active='t' AND title_for_search ~* '^".$char."'; "; $total = $this->getOne($sql); $sql = "SELECT * FROM movie WHERE active='t' AND title_for_search ~* '^".$char."' ORDER BY title_en LIMIT ".(int)$limit. " OFFSET ". (int)$offset."; "; $rows = $this->arrayFromSql($sql, USE_CACHE); return array($total, $rows); } function getMovieFromIndexCharJa($char, $limit=25, $offset=0) { if(strlen($char)==0) return FALSE; $sql = "SELECT count(key) FROM movie WHERE active='t' AND title_roman ~* '^".$char."'; "; $total = $this->getOne($sql); $sql = "SELECT * FROM movie WHERE active='t' AND title_roman ~* '^".$char."' ORDER BY title_yomi LIMIT ".(int)$limit. " OFFSET ". (int)$offset."; "; $rows = $this->arrayFromSql($sql, USE_CACHE); return array($total, $rows); } function getMovieFromIndexNum($limit=25, $offset=0) { $sql = "SELECT count(key) FROM movie WHERE active='t' AND title_for_search ~* '^[0-9]'; "; $total = $this->getOne($sql); $sql = "SELECT * FROM movie WHERE active='t' AND title_for_search ~* '^[0-9]' ORDER BY title_en LIMIT ".(int)$limit. " OFFSET ". (int)$offset."; "; $rows = $this->arrayFromSql($sql, USE_CACHE); return array($total, $rows); } function getMovieFromIndexEtc($limit=25, $offset=0) { $sql = "SELECT count(key) FROM movie WHERE active='t' AND title_for_search !~* '^[0-9a-zA-Z]'; "; $total = $this->getOne($sql); $sql = "SELECT * FROM movie WHERE active='t' AND title_for_search !~* '^[0-9a-zA-Z]' ORDER BY title_en LIMIT ".(int)$limit. " OFFSET ". (int)$offset."; "; $rows = $this->arrayFromSql($sql, USE_CACHE); return array($total, $rows); } function getMovieFromGenre($code_genre, $limit=25, $page=1) { $offset = $limit*($page-1); $sql = "SELECT count(l.code) FROM movie m LEFT JOIN linkage l ON m.key = l.movie_key WHERE m.active='t' AND l.code_genre = '".$code_genre."'; "; $total = $this->getOne($sql); $sql = "SELECT m.* FROM movie m LEFT JOIN linkage l ON m.key = l.movie_key WHERE m.active='t' AND l.code_genre = '".(int)$code_genre."' "; $sql .= "ORDER BY production_year DESC LIMIT ".(int)$limit. " OFFSET ". (int)$offset."; "; $rows = $this->arrayFromSql($sql, USE_CACHE); return array($total, $rows); } function getMovieFromCode($code, $cache=USE_CACHE, $modePreview=FALSE) { $sql = "SELECT * FROM movie m WHERE m.code = '".(int)$code."' "; if($modePreview==FALSE) $sql .= " AND m.active = 't' "; $sql .= ';'; if($rows = $this->arrayFromSql($sql, $cache)){ return $rows[0]; } return false; } function getMovieFromKey($key, $cache=USE_CACHE, $modePreview=FALSE) { $sql = "SELECT * FROM movie m WHERE m.key = '".$this->sanitize($key)."' "; if($modePreview==FALSE) $sql .= " AND m.active = 't' "; $sql .= ';'; if($rows = $this->arrayFromSql($sql, $cache)){ return $rows[0]; } return false; } function getMovieFromPerson($code_person) { $sql = 'SELECT m.*, l.description_ja, l.description_en FROM movie m LEFT JOIN linkage l ON m.key = l.movie_key'; $sql .= " WHERE m.active='t' AND l.code_person = '".$code_person."'; "; return $this->arrayFromSql($sql, USE_CACHE); } function getMovieFromPersonAsProduction($code_person) { $sql = 'SELECT m.*, l.description_ja, l.description_en FROM movie m LEFT JOIN linkage l ON m.key = l.movie_key'; $sql .= " WHERE m.active='t' AND l.code_person = '".$code_person."' AND l.code_role IN ( SELECT code FROM role WHERE type = 'Production' ) "; $sql .= " ORDER BY m.production_year DESC; "; return $this->arrayFromSql($sql, USE_CACHE); } function getMovieFromPersonAsProductionStudio($code_person) { $sql = 'SELECT m.*, l.description_ja, l.description_en FROM movie m LEFT JOIN linkage l ON m.key = l.movie_key'; $sql .= " WHERE m.active='t' AND l.code_person = '".$code_person."' AND l.code_role IN ( SELECT code FROM role WHERE type = 'Production_Studio' ) "; $sql .= " ORDER BY m.production_year DESC; "; return $this->arrayFromSql($sql, USE_CACHE); } function getMovieFromPersonAsDistributor($code_person) { $sql = 'SELECT m.*, l.description_ja, l.description_en FROM movie m LEFT JOIN linkage l ON m.key = l.movie_key'; $sql .= " WHERE m.active='t' AND l.code_person = '".$code_person."' AND l.code_role IN ( SELECT code FROM role WHERE type = 'Distributor' ) "; $sql .= " ORDER BY m.production_year DESC; "; return $this->arrayFromSql($sql, USE_CACHE); } function getMovieFromPersonAsDirector($code_person) { $sql = 'SELECT m.*, l.description_ja, l.description_en FROM movie m LEFT JOIN linkage l ON m.key = l.movie_key'; $sql .= " WHERE m.active='t' AND l.code_person = '".$code_person."' AND l.code_role IN ( SELECT code FROM role WHERE type = 'Director' ) "; $sql .= " ORDER BY m.production_year DESC; "; return $this->arrayFromSql($sql, USE_CACHE); } function getMovieFromPersonAsProducer($code_person) { $sql = 'SELECT m.*, l.description_ja, l.description_en FROM movie m LEFT JOIN linkage l ON m.key = l.movie_key'; $sql .= " WHERE m.active='t' AND l.code_person = '".$code_person."' AND l.code_role IN ( SELECT code FROM role WHERE type = 'Producer' ) "; $sql .= " ORDER BY m.production_year DESC; "; return $this->arrayFromSql($sql, USE_CACHE); } function getMovieFromPersonAsStaff($code_person) { $sql = 'SELECT m.*, l.description_ja, l.description_en FROM movie m LEFT JOIN linkage l ON m.key = l.movie_key'; $sql .= " WHERE m.active='t' AND l.code_person = '".$code_person."' AND l.code_role IN ( SELECT code FROM role WHERE type = 'Staff' ) "; $sql .= " ORDER BY m.production_year DESC; "; return $this->arrayFromSql($sql, USE_CACHE); } function getMovieFromPersonAsCast($code_person) { $sql = 'SELECT m.*, l.description_ja, l.description_en FROM movie m LEFT JOIN linkage l ON m.key = l.movie_key'; $sql .= " WHERE m.active='t' AND l.code_person = '".$code_person."' AND l.code_role IN ( SELECT code FROM role WHERE type = 'Cast' ) "; $sql .= " ORDER BY m.production_year DESC; "; return $this->arrayFromSql($sql, USE_CACHE); } function nMovieFromGenre($code_genre) { $sql = "SELECT count(l.code) FROM movie m LEFT JOIN linkage l ON m.key = l.movie_key WHERE m.active='t' AND l.code_genre = '".$code_genre."'; "; return $this->getOne($sql); } function updateMovie($code, $P) { foreach($P as $k=>$v){ if(!is_array($v)) $P[$k] = $this->sanitize(addslashes($v)); } $key = md5($P['RELEASE_YEAR'].$P['TITLE_JA']); $sql = 'UPDATE movie SET '; // $sql .= "key = '".$key."', "; // $sql .= "release_year = '".$P['RELEASE_YEAR']."', "; $sql .= "title_en = '".$P['TITLE_EN']."', "; $sql .= "title_ja = '".$P['TITLE_JA']."', "; // $sql .= "title_org = '".$P['TITLE_ORG']."', "; // $sql .= "title_yomi = '".$P['TITLE_YOMI']."', "; $sql .= "description_en = '".$P['OUTLINE_EN']."', "; $sql .= "description_ja = '".$P['OUTLINE_JA']."' "; $sql .= "screen_format = '".$P['SCREEN_FORMAT']."', "; $sql .= "screen_size = '".$P['SCREEN_SIZE']."', "; $sql .= "screen_other = '".$P['SCREEN_OTHER']."', "; $sql .= "color = '".$P['COLOR']."', "; $sql .= "color_other = '".$P['COLOR']."', "; $sql .= "sound_system = '".$P['SOUND_SYSTEM']."', "; $sql .= "sound_process = '".$P['SOUND_PROCESS']."', "; $sql .= "sound_other = '".$P['SOUND_OTHER']."', "; $sql .= "rating = '".$P['RATING']."', "; // $sql .= "public = '".(($P['PUBLIC'][1]==1)?'t':'f')."' "; $sql .= "WHERE code = '".(int)$code."'; "; // $sql .= "UPDATE linkage SET movie_key='".$key."' WHERE movie_key='".$key."'; "; if($this->exec($sql)) return $key; return false; } function updateMovieAwards($code, $P) { foreach($P as $k=>$v){ if(!is_array($v)) $P[$k] = $this->sanitize(addslashes($v)); } $sql = 'UPDATE movie SET '; $sql .= "awards_en = '".$P['AWARDS_EN']."', "; $sql .= "awards_ja = '".$P['AWARDS_JA']."' "; $sql .= "WHERE code = '".(int)$code."'; "; return $this->exec($sql); } function insertMovie($P) { foreach($P as $k=>$v){ if(!is_array($v)) $P[$k] = $this->sanitize(addslashes($v)); } $key = md5($P['RELEASE_YEAR'].$P['TITLE_JA']); $sql = 'INSERT INTO movie (key, release_year, '; $sql .= ' title_en, title_ja, title_org, title_roman, '; $sql .= ' description_en, description_ja, '; $sql .= ' screen_type, screen_time, color, sound, rating, '; $sql .= ' public ) VALUES ('; $sql .= "'".$key."', "; $sql .= "'".$P['RELEASE_YEAR']."', "; $sql .= "'".$P['TITLE_EN']."', "; $sql .= "'".$P['TITLE_JA']."', "; $sql .= "'".$P['TITLE_ORG']."', "; $sql .= "'".$P['TITLE_ROMAN']."', "; $sql .= "'".$P['OUTLINE_EN']."', "; $sql .= "'".$P['OUTLINE_JA']."', "; $sql .= "'".$P['SCREEN_TYPE']."', "; $sql .= "'".$P['SCREEN_TIME']."', "; $sql .= "'".$P['COLOR']."', "; $sql .= "'".$P['SOUND']."', "; $sql .= "'".$P['RATING']."', "; $sql .= "'f' "; $sql .= ");"; if($this->exec($sql)) return $key; return false; } function getSuspendedMovies($limit=25, $offset=0) { $sql = "SELECT * FROM movie WHERE public = 'f' ORDER BY created_on DESC LIMIT ".(int)$limit. " OFFSET ". (int)$offset."; "; $rows = $this->arrayFromSql($sql); $sql = "SELECT count(key) FROM movie WHERE public = 'f'; "; $total = $this->getOne($sql); return array($total, $rows); } function getOmnibusFromMovieKey($key) { $sql = "SELECT o.* FROM omnibus o LEFT JOIN linkage l ON o.code = l.code_omnibus "; $sql .= "WHERE movie_key = '".$key."';"; return $this->arrayFromSql($sql); } function insertOmnibus($P) { foreach($P as $k=>$v) $P[$k] = $this->sanitize(addslashes($v)); $sql = "SELECT nextval('omnibus_code_seq'::regclass);"; $code = $this->getOne($sql); $sql = "INSERT INTO omnibus (code, title_ja, title_en, type)"; $sql .= " VALUES ($code, '".$P['TITLE_JA']."', '".$P['TITLE_EN']."', '".$P['TYPE']."')"; if( $this->exec($sql) ) return $code; return false; } function updateOmnibus($code, $P) { foreach($P as $k=>$v) $P[$k] = $this->sanitize(addslashes($v)); $sql = 'UPDATE omnibus SET '; $sql .= "title_ja = '".$P['TITLE_JA']."', "; $sql .= "title_en = '".$P['TITLE_EN']."', "; $sql .= "type = '".$P['TYPE']."' "; $sql .= "WHERE code = '".(int)$code."';"; return $this->exec($sql); } function getOmnibusFromCode($code, $cache=USE_CACHE) { $sql = "SELECT * FROM omnibus WHERE code = '".$code."';"; return $this->arrayFromSql($sql); } function insertOmnibusLinkage($movie_key, $code_omnibus) { $sql = "INSERT INTO linkage (movie_key, code_omnibus) VALUES ('".$movie_key."', '".$code_omnibus."');"; return $this->exec($sql); } function getTitleFromOmnibusCode($code) { $sql = "SELECT m.* FROM movie m LEFT JOIN linkage l ON m.key = l.movie_key"; $sql .= " WHERE l.code_omnibus = '".$code."'"; $sql .= " ORDER BY priority ASC;"; return $this->arrayFromSql($sql); } function getPerson($limit=25, $page=1) { $offset = $limit * ($page-1); $sql = "SELECT count(code) FROM person;"; $total = $this->getOne($sql); $sql = "SELECT * FROM person ORDER BY code DESC LIMIT ".(int)$limit. " OFFSET ". (int)$offset."; "; $rows = $this->arrayFromSql($sql, USE_CACHE); return array($total, $rows); } function getPersonFromType($code_role, $limit=25, $page=1) { $offset = $limit * ($page-1); $sql = "SELECT count(p.code) FROM person p LEFT JOIN linkage l ON p.code = l.code_person WHERE l.code_role = '".$code_role."';"; $total = $this->getOne($sql); $sql = "SELECT p.* FROM person p LEFT JOIN linkage l ON p.code = l.code_person WHERE l.code_role = '".$code_role."' ORDER BY p.code DESC LIMIT ".(int)$limit. " OFFSET ". (int)$offset."; "; $rows = $this->arrayFromSql($sql, USE_CACHE); return array($total, $rows); } function getPersonFromCode($code) { $sql = "SELECT * FROM person WHERE code = '".(int)$code."';"; if($rows = $this->arrayFromSql($sql, NO_USE_CACHE)){ return $rows[0]; } return FALSE; } function getPersonFromAbsCode($code) { $sql = "SELECT * FROM person WHERE abs_code = '".$code."';"; return $this->arrayFromSql($sql, NO_USE_CACHE); } function getActorFromMovieKey($movie_key) { $sql = "SELECT p.*, l.description_ja, l.description_en, l.memo_ja, l.memo_en, l.priority FROM linkage l LEFT JOIN person p ON l.code_person = p.code "; $sql .= " WHERE l.movie_key = '".$movie_key."' AND l.code_role IN ( SELECT code FROM role WHERE type = 'Cast' ) "; $sql .= " ORDER BY l.priority; "; return $this->arrayFromSql($sql, USE_CACHE); } function getStaffFromMovieKey($movie_key) { $sql = "SELECT p.*, l.description_ja, l.description_en, l.memo_ja, l.memo_en, l.priority FROM linkage l LEFT JOIN person p ON l.code_person = p.code "; $sql .= " WHERE l.movie_key = '".$movie_key."' AND l.code_role IN ( SELECT code FROM role WHERE type = 'Staff' ) "; $sql .= " ORDER BY l.priority; "; return $this->arrayFromSql($sql, USE_CACHE); } function getProducerFromMovieKey($movie_key) { $sql = "SELECT p.*, l.description_ja, l.description_en, l.priority FROM linkage l LEFT JOIN person p ON l.code_person = p.code "; $sql .= " WHERE l.movie_key = '".$movie_key."' AND l.code_role IN ( SELECT code FROM role WHERE type = 'Producer' ) "; $sql .= " ORDER BY l.priority; "; return $this->arrayFromSql($sql, USE_CACHE); } function getDirectorFromMovieKey($movie_key) { $sql = "SELECT p.*, l.description_ja, l.description_en, l.priority FROM linkage l LEFT JOIN person p ON l.code_person = p.code "; $sql .= " WHERE l.movie_key = '".$movie_key."' AND l.code_role IN ( SELECT code FROM role WHERE type = 'Director' ) "; $sql .= " ORDER BY l.priority; "; return $this->arrayFromSql($sql, USE_CACHE); } function getProductionCompanyFromMovieKey($movie_key) { $sql = "SELECT p.*, l.description_ja, l.description_en, l.priority FROM linkage l LEFT JOIN person p ON l.code_person = p.code "; $sql .= " WHERE l.movie_key = '".$movie_key."' AND l.code_role IN ( SELECT code FROM role WHERE type = 'Production' ) "; $sql .= " ORDER BY l.priority; "; return $this->arrayFromSql($sql, USE_CACHE); } function getDistributorFromMovieKey($movie_key) { $sql = "SELECT p.*, l.description_ja, l.description_en, l.priority FROM linkage l LEFT JOIN person p ON l.code_person = p.code "; $sql .= " WHERE l.movie_key = '".$movie_key."' AND l.code_role IN ( SELECT code FROM role WHERE type = 'Distributor' ) "; $sql .= " ORDER BY l.priority; "; return $this->arrayFromSql($sql, USE_CACHE); } function getProductionStudioFromMovieKey($movie_key) { $sql = "SELECT p.*, l.description_ja, l.description_en, l.priority FROM linkage l LEFT JOIN person p ON l.code_person = p.code "; $sql .= " WHERE l.movie_key = '".$movie_key."' AND l.code_role IN ( SELECT code FROM role WHERE type = 'Production_Studio' ) "; $sql .= " ORDER BY l.priority; "; return $this->arrayFromSql($sql, USE_CACHE); } function addAbsFromCode($code,$targetcode) { $person = $this -> getPersonFromCode($code); $person = $person[0]; $target = $this -> getPersonFromCode($targetcode); $target = $target[0]; if ($person['abs_code'] > 0) { $sql = 'UPDATE person SET abs_code = '. $person['abs_code']. ' WHERE code = '. $target['code']; $this->exec($sql); } elseif ($target['abs_code'] > 0) { $sql = 'UPDATE person SET abs_code = '. $target['abs_code']. ' WHERE code = '. $person['code']; $this->exec($sql); } else { $sql = "SELECT nextval('person_abs_code_seq'::regclass);"; $nextval = $this->getOne($sql); $sql = 'UPDATE person SET abs_code = ' . $nextval. ' WHERE code = '. $person['code']. ' OR code = '. $target['code']; $this->exec($sql); } } function delAbsFromCode($code,$targetcode) { $sql = 'UPDATE person SET abs_code = NULL where code = ' . $targetcode.';'; $this->exec($sql); } function updatePersonFromCode($code,$ja,$en) { $sql = "UPDATE person SET name_ja = '" .$ja. "' , name_en = '". $en. "' WHERE code = ".$code; $this->exec($sql); } function getRoleList() { $sql = "SELECT * FROM role ORDER BY code;"; return $this->arrayFromSql($sql, USE_CACHE); } function getRoleListWithCount() { $sql = "SELECT l.code_role, r.title_ja, r.title_en, count(l.code) FROM role r "; $sql .= " LEFT JOIN linkage l ON r.code = l.code_role "; $sql .= " WHERE r.type IN ('Director', 'Producer', 'Staff', 'Cast') "; $sql .= " GROUP BY l.code_role, r.title_ja, r.title_en "; $sql .= " ORDER BY count DESC limit 10 ; "; return $this->arrayFromSql($sql, USE_CACHE); } function getRoleType($roleArray) { foreach($roleArray as $r) $t[] = "'".$this->sanitize($r)."'"; $sql = "SELECT r.code, r.title_ja, r.title_en FROM role r "; $sql .= " WHERE r.active='t' AND r.title_ja IN (".join(",", $t).");"; return $this->arrayFromSql($sql, USE_CACHE); } function wordageSearchKeys($keys) { $q = mb_ereg_replace(" | |・", ' ', addslashes(trim($keys))); $tmp = explode(' ', $q); if(count($tmp)>=2){ foreach($tmp as $t){ if( mb_strlen($t)>1 ){ $p[] = $t; } } $q = ''; $q = join(' ', $p); } if( $lines = explode("\n", file_get_contents($_SERVER['DOCUMENT_ROOT'].'/lib/trans_kanji.txt')) ){ $src[0][] = '高'; $rpl[0][] = mb_convert_encoding("髙", "UTF-8", "HTML-ENTITIES"); $src[0][] = '�'; $rpl[0][] = '高'; foreach($lines as $l){ $kanji = explode("/", $l); $n = count($kanji); if($n>=2){ $m = 0; for($i=0;$i<$n;$i++){ for($j=0;$j<$n;$j++){ if($kanji[$i] == $kanji[$j]) continue; $src[$m][] = $kanji[$i]; $rpl[$m][] = $kanji[$j]; $src[$m][] = $kanji[$j]; $rpl[$m][] = $kanji[$i]; $m++; } } } } foreach($src as $index => $s){ $querys[md5(str_replace($s, $rpl[$index], $q))] = str_replace($s, $rpl[$index], $q); } }else{ $querys[] = $q; } return $querys; } function searchMovies($keys, $limit=25, $page=1, $sort='SCORE', $genre=null, $ryearfrom=null, $ryearto=null, $pyearfrom=null, $pyearto=null, $durationfrom=null, $durationto=null, $titleonly=false, $subtitle=null, $subtitle_other=False, $subtitle_text=null) { // global $gLang; $cri[] = "active = 't'"; if(strlen($keys)){ $keys = mb_ereg_replace("[  ]+", ' ', addslashes(trim($keys))); $q = str_replace("'", "\'", mb_ereg_replace(" | |・|・", ' ', trim($keys))); $keys = $this->sanitize($keys); if($titleonly==false){ $cri[] = "i.tsv @@ query"; }else{ if ( $gLang == 'en') { $cri[] = "to_tsvector('english', m.title_en) @@ query"; } else { $cri[] = "to_tsvector('japanese', m.title_ja) @@ query"; } } } if((int)$ryearfrom>0){ $cri[] = "m.release_year >= ".(int)$ryearfrom; } if((int)$ryearto>0){ $cri[] = "m.release_year <= ".(int)$ryearto; } if((int)$pyearfrom>0){ $cri[] = "m.production_year >= ".(int)$pyearfrom; } if((int)$pyearto>0){ $cri[] = "m.production_year <= ".(int)$pyearto; } if((int)$durationfrom>0){ $cri[] = "m.duration >= ".(int)$durationfrom; } if((int)$durationto>0){ $cri[] = "m.duration <= ".(int)$durationto; } if(strlen($subtitle)>0){ $cri[] = "m.subtitle && array['".join("','", $this->sanitize($subtitle))."']"; } if($subtitle_other){ $cri[] = "m.subtitle_text IS NOT NULL"; } if(strlen($subtitle_text)>0){ $cri[] = "m.subtitle_text ~* '". $this->sanitize($subtitle_text). "'"; } $where = 'WHERE ' . join(' AND ', $cri); if(is_array($genre)){ // $gwhere[] = "l.code_genre IN (".join(",", $genre).")"; $gwhere1 = $gwhere2 = $gwhere3 = array(); foreach($genre as $g){ // 34 // 5678 // ... switch ($g) { case "3": case "4": $gwhere1[] = "l1.code_genre = ".(int)$g; break; case "5": case "6": case "7": case "8": case "9": $gwhere2[] = "l2.code_genre = ".(int)$g; break; default: $gwhere3[] = "l3.code_genre = ".(int)$g; break; } } if($gwhere1) $gwhere[] = join(" OR ", $gwhere1); if($gwhere2) $gwhere[] = join(" OR ", $gwhere2); if($gwhere3) $gwhere[] = join(" OR ", $gwhere3); } // 並び替え $offset = $limit*($page-1); switch($sort){ case 'TITLE_A': $order_mode = 'm.title_roman ASC'; break; case 'TITLE_D': $order_mode = 'm.title_roman DESC'; break; case 'PROD_A': $order_mode = 'm.production_year ASC'; break; case 'PROD_D': $order_mode = 'm.production_year DESC'; break; case 'RELE_A': $order_mode = 'm.release_year ASC'; break; case 'RELE_D': $order_mode = 'm.release_year DESC'; break; case 'SCORE': default: $order_mode = 'rank DESC'; } $opt = sprintf(" ORDER BY %s LIMIT %d OFFSET %d ", $order_mode, (int)$limit, (int)$offset); // SQL作成 $query_base ="SELECT %s FROM %s ". "LEFT JOIN search_index_movie_fulltext i ON m.key = i.movie_key, ". "to_tsquery('japanese', web_query('%s')) as query %s %s;"; $select_fetch = "m.*, (ts_rank_cd(to_tsvector('japanese', m.title_ja), query)*10 + ts_rank_cd(to_tsvector('japanese', m.title_en), query)*10 + ts_rank_cd( i.tsv, query)) as rank "; $select_count = "count(*)"; $target = "movie m"; if ($gwhere) { $target = "(SELECT * FROM movie WHERE code IN (SELECT movie.code FROM movie " . "LEFT JOIN linkage l1 ON l1.movie_key = movie.key AND l1.code_genre IN (3,4) ". "LEFT JOIN linkage l2 ON l2.movie_key = movie.key AND l2.code_genre IN (5,6,7,8,9) ". "LEFT JOIN linkage l3 ON l3.movie_key = movie.key AND l3.code_genre NOT IN (3,4,5,6,7,8,9) ". "WHERE (" . join(") AND (", $gwhere). "))) as m"; } $total = $this->getOne(sprintf($query_base, $select_count, $target, $keys, $where, '')); $rows = $this->arrayFromSql(sprintf($query_base, $select_fetch, $target, $keys, $where, $opt)); return array($total, $rows); if(strlen($keys)){ if( $lines = explode("\n", file_get_contents($_SERVER['DOCUMENT_ROOT'].'/lib/trans_kanji.txt')) ){ foreach($lines as $l){ $kanji = explode("/", $l); $n = count($kanji); if($n>=2){ $m = 0; for($i=0;$i<$n;$i++){ for($j=0;$j<$n;$j++){ if($kanji[$i] == $kanji[$j]) continue; $src[$m][] = $kanji[$i]; $rpl[$m][] = $kanji[$j]; $src[$m][] = $kanji[$j]; $rpl[$m][] = $kanji[$i]; $m++; } } } } foreach($src as $index => $s){ $qq[md5(str_replace($s, $rpl[$index], $q))] = str_replace($s, $rpl[$index], $q); } foreach($qq as $query){ $f1[] = "s.fulltext @@ '*D+ ".$query."'"; } } } } function searchPerson($keys, $limit=250, $page=1, $role=null, $sort_key='t1.name_en') { $offset = $limit*($page-1); $queries = $this->wordageSearchKeys($keys); $searchTargets = array('name_ja', 'name_yomi_full', 'name_en'); $roleTitles = array('title_ja', 'title_en'); $query_base = " SELECT p.*, 0 as rank FROM person p LEFT JOIN person p2 ON %s.code = %s.abs_code". " LEFT JOIN linkage l ON l.code_person = p.code ". " LEFT JOIN role r ON r.code = l.code_role ". " LEFT JOIN movie m ON m.key = l.movie_key ". "WHERE p.active = 't' AND l.movie_key IS NOT NULL AND m.active = 't'"; if($keys) $query_base .= " AND to_tsvector('japanese', %s.%s) @@ to_tsquery('japanese', web_query('%s'))"; if($role){ $role_sql = "SELECT title_en FROM role WHERE title_ja IN ('". join("','", $role) ."')"; $role_rows = $this->arrayFromSql($role_sql); if($role_rows){ $role = array();foreach($role_rows as $rr) $role[] = $rr['title_en']; } $query_base .= " AND r.title_en IN ('". join("','", $role) ."')"; } foreach($queries as $q){ $q = $this->sanitize($q); foreach($searchTargets as $st){ foreach($roleTitles as $t){ $p_sql[] = sprintf($query_base, 'p', 'p2', 'p', $st, $q, $t); $p_sql[] = sprintf($query_base, 'p', 'p2', 'p2', $st, $q, $t); $p_sql[] = sprintf($query_base, 'p2', 'p', 'p', $st, $q, $t); $p_sql[] = sprintf($query_base, 'p2', 'p', 'p2', $st, $q, $t); } } } $union_sql = '('. join(") UNION ALL (", $p_sql). ') '; $total_sql = "SELECT count(t1.code) FROM (SELECT DISTINCT ON (u.code) u.code FROM ( ".$union_sql.") as u) as t1;"; $total = $this->getOne($total_sql); $row_sql = "SELECT t1.* FROM ( SELECT DISTINCT ON (u.code) u.* FROM ( ".$union_sql.") as u ) as t1 ORDER BY t1.rank DESC, t1.name_yomi_full LIMIT ".(int)$limit ."OFFSET ". (int)$offset."; "; $rows = $this->arrayFromSql($row_sql); return array($total, $rows); } function searchContact($keys, $limit=25, $page=1, $type=null, $domestic='f') { $offset = $limit*($page-1); $q = mb_ereg_replace(" | |・|・", ' ', addslashes(trim($keys))); $sql = "SELECT * FROM contact WHERE active = 't' AND domestic = '".$this->sanitize($domestic)."' AND type!='MOVIE' "; if(strlen($keys)>0) $sql .= " AND to_tsvector('japanese', name) @@ to_tsquery('japanese', web_query('".$q."')) "; if(is_array($type)){ foreach($type as $t) $typeArray[] = "'".$this->sanitize($t)."'"; $sql .= " AND type IN (".join(",", $typeArray).") "; }else if(strlen($type)){ $sql .= " AND type = '".$this->sanitize($type)."' "; } $sql .=" LIMIT ".(int)$limit. " OFFSET ". (int)$offset."; "; $rows = $this->arrayFromSql($sql); $sql = "SELECT count(code) FROM contact WHERE active='t' AND domestic = '".$this->sanitize($domestic)."' AND type!='MOVIE' "; if(strlen($keys)>0) $sql .= " AND to_tsvector('japanese', name) @@ to_tsquery('japanese', web_query('".$q."')) "; if(is_array($type)){ foreach($type as $t) $typeArray[] = "'".$this->sanitize($t)."'"; $sql .= " AND type IN (".join(",", $typeArray).") "; }else if(strlen($type)){ $sql .= " AND type = '".$this->sanitize($type)."' "; } $sql .= ";"; $total = $this->getOne($sql); return array($total, $rows); } function getTrailerFromMovieKey($key) { $sql = "SELECT * FROM trailer WHERE movie_key = '".$key."' AND path != '' AND active = 't' AND public = 't' ; "; return $this->arrayFromSql($sql, USE_CACHE); } function getTrailerFromCode($codeTrailer) { $sql = "SELECT * FROM trailer WHERE code = '". (int)$codeTrailer."' AND path != '' AND active = 't' AND public = 't' ; "; if($rows = $this->arrayFromSql($sql, USE_CACHE)){ return $rows[0]; } return false; } function userFromCode($code) { if((int)$code<=0) return false; $sql = "SELECT * FROM users WHERE code = '".(int)$code."';"; $rows = $this->arrayFromSql($sql); if(!$rows) return false; return $rows[0]; } function getUserList() { $sql = "SELECT * FROM users ORDER BY created_on DESC;"; return $this->arrayFromSql($sql); } function getIndustryType() { $sql = "SELECT * FROM industry_type WHERE active='t' AND priority > 0 ORDER BY priority ASC; "; return $this->arrayFromSql($sql, USE_CACHE); } function getOccupationType() { $sql = "SELECT * FROM occupation_type WHERE active='t' AND priority > 0 ORDER BY priority ASC; "; return $this->arrayFromSql($sql, USE_CACHE); } function getUserProfileFromCode($codeUsers) { $sql .= "SELECT u.code, u.opt_in, u.email, up.*, uo.*, uo.name as org_name, uo.dept as dept_name, uo.zip_code as zipcode FROM users u LEFT JOIN users_profile up ON u.code = up.code_users "; $sql .= " LEFT JOIN users_organization_info uo ON u.code = uo.code_users WHERE u.code = '".$codeUsers."';"; return ($rows = $this->arrayFromSql($sql) ) ? $rows[0] : FALSE; } } ?>