summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Roach <fisharebest@gmail.com>2015-02-12 16:30:54 +0000
committerGreg Roach <fisharebest@gmail.com>2015-02-12 16:30:54 +0000
commit05015f35088b528915ba45af0eeea5ae6d1b4fc5 (patch)
tree12164f551e7c7f419352f74f525b55a2b5b0af69
parente0fdecc9061febee5d102975a79c436704fa0519 (diff)
downloadwebtrees-05015f35088b528915ba45af0eeea5ae6d1b4fc5.tar.gz
webtrees-05015f35088b528915ba45af0eeea5ae6d1b4fc5.tar.bz2
webtrees-05015f35088b528915ba45af0eeea5ae6d1b4fc5.zip
SQL placeholders
-rw-r--r--includes/functions/functions_db.php56
1 files changed, 38 insertions, 18 deletions
diff --git a/includes/functions/functions_db.php b/includes/functions/functions_db.php
index c0fb5633a2..96d101be44 100644
--- a/includes/functions/functions_db.php
+++ b/includes/functions/functions_db.php
@@ -120,27 +120,38 @@ function get_note_list($ged_id) {
/**
* Search all individuals
+
*
- * @param string[] $query array of search terms
- * @param integer[] $geds array of gedcoms to search
+*@param string[] $query array of search terms
+ * @param integer[] $tree_ids array of gedcoms to search
+
*
- * @return Individual[]
+*@return Individual[]
*/
-function search_indis(array $query, array $geds) {
- // Convert the query into a SQL expression
- $querysql = array();
+function search_indis(array $query, array $tree_ids) {
// Convert the query into a regular expression
$queryregex = array();
- foreach ($query as $q) {
+ $sql = "SELECT i_id AS xref, i_file AS gedcom_id, i_gedcom AS gedcom FROM `##individuals` WHERE 1";
+ $args = array();
+
+ foreach ($query as $n => $q) {
$queryregex[] = preg_quote(I18N::strtoupper($q), '/');
- $querysql[] = "i_gedcom LIKE " . Database::quote("%{$q}%") . " COLLATE '" . I18N::$collation . "'";
+ $sql .= " AND i_gedcom COLLATE :collate_" . $n . " LIKE CONCAT('%', :query_" . $n . ", '%')";
+ $args['collate_' . $n] = I18N::$collation;
+ $args['query_' . $n] = Filter::escapeLike($q);
}
- $sql = "SELECT i_id AS xref, i_file AS gedcom_id, i_gedcom AS gedcom FROM `##individuals` WHERE (" . implode(" AND ", $querysql) . ') AND i_file IN (' . implode(',', $geds) . ')';
+ $sql .= " AND i_file IN (";
+ foreach ($tree_ids as $n => $tree_id) {
+ $sql .= $n ? ", " : "";
+ $sql .= ":tree_id_" . $n;
+ $args['tree_id_' . $n] = $tree_id;
+ }
+ $sql .= ")";
$list = array();
- $rows = Database::prepare($sql)->fetchAll();
+ $rows = Database::prepare($sql)->execute($args)->fetchAll();
foreach ($rows as $row) {
// SQL may have matched on private data or gedcom tags, so check again against privatized data.
$record = Individual::getInstance($row->xref, $row->gedcom_id, $row->gedcom);
@@ -357,25 +368,34 @@ function search_indis_dates($day, $month, $year, $facts) {
* Search family records
*
* @param string[] $query array of search terms
- * @param integer[] $geds array of gedcoms to search
+ * @param integer[] $tree_ids array of gedcoms to search
*
* @return Family[]
*/
-function search_fams($query, $geds) {
- // Convert the query into a SQL expression
- $querysql = array();
+function search_fams($query, $tree_ids) {
// Convert the query into a regular expression
$queryregex = array();
- foreach ($query as $q) {
+ $sql = "SELECT f_id AS xref, f_file AS gedcom_id, f_gedcom AS gedcom FROM `##families` WHERE 1";
+ $args = array();
+
+ foreach ($query as $n => $q) {
$queryregex[] = preg_quote(I18N::strtoupper($q), '/');
- $querysql[] = "f_gedcom LIKE " . Database::quote("%{$q}%") . " COLLATE '" . I18N::$collation . "'";
+ $sql .= " AND f_gedcom COLLATE :collate_" . $n . " LIKE CONCAT('%', :query_" . $n . ", '%')";
+ $args['collate_' . $n] = I18N::$collation;
+ $args['query_' . $n] = Filter::escapeLike($q);
}
- $sql = "SELECT f_id AS xref, f_file AS gedcom_id, f_gedcom AS gedcom FROM `##families` WHERE (" . implode(" AND ", $querysql) . ') AND f_file IN (' . implode(',', $geds) . ')';
+ $sql .= " AND f_file IN (";
+ foreach ($tree_ids as $n => $tree_id) {
+ $sql .= $n ? ", " : "";
+ $sql .= ":tree_id_" . $n;
+ $args['tree_id_' . $n] = $tree_id;
+ }
+ $sql .= ")";
$list = array();
- $rows = Database::prepare($sql)->fetchAll();
+ $rows = Database::prepare($sql)->execute($args)->fetchAll();
foreach ($rows as $row) {
// SQL may have matched on private data or gedcom tags, so check again against privatized data.
$record = Family::getInstance($row->xref, $row->gedcom_id, $row->gedcom);