function getuserfromhandle($handle) { require_once QA_INCLUDE_DIR . 'qa-app-users.php'; if (QA_FINAL_EXTERNAL_USERS) { $publictouserid = qa_get_userids_from_public(array($handle)); $userid = @$publictouserid[$handle]; } else { $userid = qa_db_read_one_value(qa_db_query_sub('SELECT userid FROM ^users WHERE handle = $', $handle), true); } return $userid; }
function qa_handle_to_userid($handle) { if (QA_FINAL_EXTERNAL_USERS) { $handleuserids = qa_get_userids_from_public(array($handle)); } else { require_once QA_INCLUDE_DIR . 'db/users.php'; $handleuserids = qa_db_user_get_handle_userids(array($handle)); } if (count($handleuserids) == 1) { return reset($handleuserids); } // don't use $handleuserids[$handle] since capitalization might be different return null; }
if (!defined('QA_VERSION')) { // don't allow this page to be requested directly from browser header('Location: ../'); exit; } require_once QA_INCLUDE_DIR . 'qa-db-selects.php'; require_once QA_INCLUDE_DIR . 'qa-app-format.php'; require_once QA_INCLUDE_DIR . 'qa-app-updates.php'; require_once QA_INCLUDE_DIR . 'qa-app-users.php'; $handle = qa_request_part(1); if (!strlen($handle)) { qa_redirect('users'); } // Get the HTML to display for the handle, and if we're using external users, determine the userid if (QA_FINAL_EXTERNAL_USERS) { $publictouserid = qa_get_userids_from_public(array($handle)); if (!count($publictouserid)) { return include QA_INCLUDE_DIR . 'qa-page-not-found.php'; } $userid = reset($publictouserid); // don't use $publictouserid[$handle] since $handle capitalization might be different $usershtml = qa_get_users_html(array($userid), false, qa_path_to_root(), true); $userhtml = @$usershtml[$userid]; } else { $userhtml = qa_html($handle); } // Find the user profile and questions and answers for this handle $loginuserid = qa_get_logged_in_userid(); $identifier = QA_FINAL_EXTERNAL_USERS ? $userid : $handle; @(list($useraccount, $userprofile, $userfields, $userpoints, $userrank, $questions, $answerqs, $commentqs, $editqs, $favorite) = qa_db_select_with_pending(QA_FINAL_EXTERNAL_USERS ? null : qa_db_user_account_selectspec($handle, false), QA_FINAL_EXTERNAL_USERS ? null : qa_db_user_profile_selectspec($handle, false), QA_FINAL_EXTERNAL_USERS ? null : qa_db_userfields_selectspec(), qa_db_user_points_selectspec($identifier), qa_db_user_rank_selectspec($identifier), qa_db_user_recent_qs_selectspec($loginuserid, $identifier, qa_opt_if_loaded('page_size_user_posts')), qa_db_user_recent_a_qs_selectspec($loginuserid, $identifier), qa_db_user_recent_c_qs_selectspec($loginuserid, $identifier), qa_db_user_recent_edit_qs_selectspec($loginuserid, $identifier), isset($loginuserid) && !QA_FINAL_EXTERNAL_USERS ? qa_db_is_favorite_selectspec($loginuserid, QA_ENTITY_USER, $handle) : null)); // Check the user exists and work out what can and can't be set (if not using single sign-on)
function qa_db_search_posts_selectspec($voteuserid, $titlewords, $contentwords, $tagwords, $handlewords, $handle, $start, $full = false, $count = null) { $count = isset($count) ? min($count, QA_DB_RETRIEVE_QS_AS) : QA_DB_RETRIEVE_QS_AS; // add LOG(postid)/1000000 here to ensure ordering is deterministic even if several posts have same score // The score also gives a bonus for hot questions, where the bonus scales linearly with hotness. The hottest // question gets a bonus equivalent to a matching unique tag, and the least hot question gets zero bonus. $selectspec = qa_db_posts_basic_selectspec($voteuserid, $full); $selectspec['columns'][] = 'score'; $selectspec['columns'][] = 'matchparts'; $selectspec['source'] .= " JOIN (SELECT questionid, SUM(score)+2*(LOG(#)*(^posts.hotness-(SELECT MIN(hotness) FROM ^posts WHERE type='Q'))/((SELECT MAX(hotness) FROM ^posts WHERE type='Q')-(SELECT MIN(hotness) FROM ^posts WHERE type='Q')))+LOG(questionid)/1000000 AS score, GROUP_CONCAT(CONCAT_WS(':', matchposttype, matchpostid, ROUND(score,3))) AS matchparts FROM ("; $selectspec['sortdesc'] = 'score'; array_push($selectspec['arguments'], QA_IGNORED_WORDS_FREQ); $selectparts = 0; if (!empty($titlewords)) { // At the indexing stage, duplicate words in title are ignored, so this doesn't count multiple appearances. $selectspec['source'] .= ($selectparts++ ? " UNION ALL " : "") . "(SELECT postid AS questionid, LOG(#/titlecount) AS score, 'Q' AS matchposttype, postid AS matchpostid FROM ^titlewords JOIN ^words ON ^titlewords.wordid=^words.wordid WHERE word IN (\$) AND titlecount<#)"; array_push($selectspec['arguments'], QA_IGNORED_WORDS_FREQ, $titlewords, QA_IGNORED_WORDS_FREQ); } if (!empty($contentwords)) { // (1-1/(1+count)) weights words in content based on their frequency: If a word appears once in content // it's equivalent to 1/2 an appearance in the title (ignoring the contentcount/titlecount factor). // If it appears an infinite number of times, it's equivalent to one appearance in the title. // This will discourage keyword stuffing while still giving some weight to multiple appearances. // On top of that, answer matches are worth half a question match, and comment/note matches half again. $selectspec['source'] .= ($selectparts++ ? " UNION ALL " : "") . "(SELECT questionid, (1-1/(1+count))*LOG(#/contentcount)*(CASE ^contentwords.type WHEN 'Q' THEN 1.0 WHEN 'A' THEN 0.5 ELSE 0.25 END) AS score, ^contentwords.type AS matchposttype, ^contentwords.postid AS matchpostid FROM ^contentwords JOIN ^words ON ^contentwords.wordid=^words.wordid WHERE word IN (\$) AND contentcount<#)"; array_push($selectspec['arguments'], QA_IGNORED_WORDS_FREQ, $contentwords, QA_IGNORED_WORDS_FREQ); } if (!empty($tagwords)) { // Appearances in the tag words count like 2 appearances in the title (ignoring the tagcount/titlecount factor). // This is because tags express explicit semantic intent, whereas titles do not necessarily. $selectspec['source'] .= ($selectparts++ ? " UNION ALL " : "") . "(SELECT postid AS questionid, 2*LOG(#/tagwordcount) AS score, 'Q' AS matchposttype, postid AS matchpostid FROM ^tagwords JOIN ^words ON ^tagwords.wordid=^words.wordid WHERE word IN (\$) AND tagwordcount<#)"; array_push($selectspec['arguments'], QA_IGNORED_WORDS_FREQ, $tagwords, QA_IGNORED_WORDS_FREQ); } if (!empty($handlewords)) { if (QA_FINAL_EXTERNAL_USERS) { require_once QA_INCLUDE_DIR . 'qa-app-users.php'; $userids = qa_get_userids_from_public($handlewords); if (count($userids)) { $selectspec['source'] .= ($selectparts++ ? " UNION ALL " : "") . "(SELECT postid AS questionid, LOG(#/qposts) AS score, 'Q' AS matchposttype, postid AS matchpostid FROM ^posts JOIN ^userpoints ON ^posts.userid=^userpoints.userid WHERE ^posts.userid IN (\$) AND type='Q')"; array_push($selectspec['arguments'], QA_IGNORED_WORDS_FREQ, $userids); } } else { $selectspec['source'] .= ($selectparts++ ? " UNION ALL " : "") . "(SELECT postid AS questionid, LOG(#/qposts) AS score, 'Q' AS matchposttype, postid AS matchpostid FROM ^posts JOIN ^users ON ^posts.userid=^users.userid JOIN ^userpoints ON ^userpoints.userid=^users.userid WHERE handle IN (\$) AND type='Q')"; array_push($selectspec['arguments'], QA_IGNORED_WORDS_FREQ, $handlewords); } } if (strlen($handle)) { // to allow searching for multi-word usernames (only works if search query contains full username and nothing else) if (QA_FINAL_EXTERNAL_USERS) { $userids = qa_get_userids_from_public(array($handle)); if (count($userids)) { $selectspec['source'] .= ($selectparts++ ? " UNION ALL " : "") . "(SELECT postid AS questionid, LOG(#/qposts) AS score, 'Q' AS matchposttype, postid AS matchpostid FROM ^posts JOIN ^userpoints ON ^posts.userid=^userpoints.userid WHERE ^posts.userid=\$ AND type='Q')"; array_push($selectspec['arguments'], QA_IGNORED_WORDS_FREQ, reset($userids)); } } else { $selectspec['source'] .= ($selectparts++ ? " UNION ALL " : "") . "(SELECT postid AS questionid, LOG(#/qposts) AS score, 'Q' AS matchposttype, postid AS matchpostid FROM ^posts JOIN ^users ON ^posts.userid=^users.userid JOIN ^userpoints ON ^userpoints.userid=^users.userid WHERE handle=\$ AND type='Q')"; array_push($selectspec['arguments'], QA_IGNORED_WORDS_FREQ, $handle); } } if ($selectparts == 0) { $selectspec['source'] .= '(SELECT NULL as questionid, 0 AS score, NULL AS matchposttype, NULL AS matchpostid FROM ^posts WHERE postid IS NULL)'; } $selectspec['source'] .= ") x LEFT JOIN ^posts ON ^posts.postid=questionid GROUP BY questionid ORDER BY score DESC LIMIT #,#) y ON ^posts.postid=y.questionid"; array_push($selectspec['arguments'], $start, $count); return $selectspec; }
function qa_handles_to_userids($handles, $exactonly = false) { require_once QA_INCLUDE_DIR . 'qa-util-string.php'; if (QA_FINAL_EXTERNAL_USERS) { $rawhandleuserids = qa_get_userids_from_public($handles); } else { require_once QA_INCLUDE_DIR . 'qa-db-users.php'; $rawhandleuserids = qa_db_user_get_handle_userids($handles); } $gothandleuserids = array(); if ($exactonly) { // only take the exact matches foreach ($handles as $handle) { $gothandleuserids[$handle] = @$rawhandleuserids[$handle]; } } else { // normalize to lowercase without accents, and then find matches $normhandleuserids = array(); foreach ($rawhandleuserids as $handle => $userid) { $normhandleuserids[qa_string_remove_accents(qa_strtolower($handle))] = $userid; } foreach ($handles as $handle) { $gothandleuserids[$handle] = @$normhandleuserids[qa_string_remove_accents(qa_strtolower($handle))]; } } return $gothandleuserids; }
*/ if (!defined('QA_VERSION')) { // don't allow this page to be requested directly from browser header('Location: ../'); exit; } // report that we entered this page qa_report_event('page_enter', qa_get_logged_in_userid(), qa_get_logged_in_handle(), qa_cookie_get(), array('params' => $_SERVER['QUERY_STRING'], 'path' => $_SERVER['SCRIPT_NAME'])); require_once QA_INCLUDE_DIR . 'qa-db-selects.php'; require_once QA_INCLUDE_DIR . 'qa-app-format.php'; require_once QA_INCLUDE_DIR . 'qa-app-users.php'; if (!strlen(@$pass_subrequests[0])) { qa_redirect('users'); } if (QA_FINAL_EXTERNAL_USERS) { $publictouserid = qa_get_userids_from_public(array(@$pass_subrequests[0])); $userid = @$publictouserid[@$pass_subrequests[0]]; if (!isset($userid)) { return include QA_INCLUDE_DIR . 'qa-page-not-found.php'; } $usershtml = qa_get_users_html(array($userid), false, $qa_root_url_relative, true); $userhtml = @$usershtml[$userid]; } else { $handle = @$pass_subrequests[0]; // picked up from qa-page.php $userhtml = qa_html($handle); } // Find the user profile and questions and answers for this handle $identifier = QA_FINAL_EXTERNAL_USERS ? $userid : $handle; @(list($useraccount, $userprofile, $userfields, $userpoints, $userrank, $questions, $answerquestions, $commentquestions) = qa_db_select_with_pending(QA_FINAL_EXTERNAL_USERS ? null : qa_db_user_account_selectspec($handle, false), QA_FINAL_EXTERNAL_USERS ? null : qa_db_user_profile_selectspec($handle, false), QA_FINAL_EXTERNAL_USERS ? null : qa_db_userfields_selectspec(), qa_db_user_points_selectspec($identifier), qa_db_user_rank_selectspec($identifier), qa_db_user_recent_qs_selectspec($qa_login_userid, $identifier), qa_db_user_recent_a_qs_selectspec($qa_login_userid, $identifier), qa_db_user_recent_c_qs_selectspec($qa_login_userid, $identifier))); // Check the user exists and work out what can and can't be set (if not using single sign-on)
function getuserfromhandle($handle) { require_once QA_INCLUDE_DIR . 'qa-app-users.php'; $publictouserid = qa_get_userids_from_public(array($handle)); $userid = @$publictouserid[$handle]; if (!isset($userid)) { return; } return $userid; }