1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| <?php
/**
* Get all comments attached to an article
*
* @param PDO $pdo The database connection
* @param integer $id The article ID
* @param array $search_params [optionnal] Additionnal search parameters
* @param array $options [optionnal] Additionnal query optiopns (GROUP BY and/or LIMIT)
* @throws InvalidArgumentException
* @throws RuntimeException
* @return array
*/
function get_article_comments (PDO $pdo, $id, array $search_params = array(), array $options = array()) {
// Parameters validation
if ($pdo === null)
throw new InvalidArgumentException("First parameter is expected to be a valid PDO ressource object, null given");
if ($id === null)
throw new InvalidArgumentException("Second parameters is expected to be a valid Article ID, null given");
// Fetch Comments Query Generation
$query = "SELECT id_commentaire,u_id,commentaire_titre,commentaire_contenu,commentaire_timestamp ".
"FROM pevtt_commentaire AS c ".
"JOIN pevtt_commentaire_article AS ca ON (ca.`id_commentaire`=c.`id_commentaire`)".
// Where Clause Construction
$where_clause = array('id_article' => $id);
foreach ($search_params as $field => $search_value) {
$where_clause[] = "`{$field}`=:{$field}";
}
$query .= " WHERE " . implode(" AND ", $where_clause);
// Query Options (only ORDER BY and GROUP BY)
if (!empty($options)) {
if (isset($options['ORDER BY']))
$query .= " ORDER BY `{$options['ORDER BY']}`";
if (isset($options['LIMIT'])) {
if (is_scalar($options['LIMIT']) && $options['LIMIT'])
$query .= " LIMIT {$option['LIMIT']}";
if (is_array($options['LIMIT']))
$query .= " LIMIT " . implode(',', $options['LIMIT']);
}
}
// Prepare
$stmt = $pdo->prepare($query);
// Execute
if (!$stmt->execute($search_params))
throw new RuntimeException("Error with query: {$query}");
$comments = array();
while ($comment = $stmt->fetch(PDO::FETCH_ASSOC)) {
try {
// here the magic occurs !
$comment['children'] = get_child_comments($pdo, $comment['id_commentaire']);
}
catch (Exception $e) {
$comment['children'] = null;
trigger_error("Unable to retrieve child comments for {$comment['id_commentaire']}. Reason: {$e->getMessage()}");
}
$comments[] = $comment;
}
return $comments;
}
/**
* Get all children of a given comment
*
* Note: if the depth parameter is greater than 1
* it will retrieve the children until the
* max depth is reached.
*
* @param PDO $pdo The database connection object
* @param integer $parent_id The parent comment id
* @param integer $depth [optionnal] The max depth to reach
* @throws InvalidArguemntException
* @throws RuntimeException
* @return array
*/
function get_child_comments (PDO $pdo, $parent_id, $depth = 10) {
// Do not go deeper than orignal depth parameter value
// Prevents an infinite reccursivity
if ($depth == 0)
return null;
// Parameters Validation
if ($parent_id === null)
throw new InvalidArgumentException("Second parameter is expected to be integer, null given");
// Query Generation
$query = "SELECT id_commentaire,u_id,commentaire_titre,commentaire_contenu,commentaire_timestamp ".
"FROM pevtt_commentaire AS c ".
"JOIN pevtt_commentaire_commente AS cc ON (cc.id_commented=c.id_commentaire) ".
"WHERE cc.id_commentant=:parent_id";
// Query Execution
$stmt = $pdo->prepare($query);
if (!$stmt->execute(array('parent_id' => $parent_id))
throw new RuntimeException("Error with query: $query");
// No Children Found
if (!$stmt->rowCount())
return null;
// Fetch children's children (Inception Coding-Style duh...)
$children = array();
while ($child = $stmt->fetch(PDO::FETCH_ASSOC)) {
try {
$child['children'] = get_child_comments($child['id_commentaire'], $depth-1);
}
catch (Exception $e) {
$child['children'] = null;
trigger_error("Unable to retrieve child comments for {$child['id_commentaire']}. Reason: {$e->getMessage()}");
}
$children[] = $child;
}
return $children;
} |
Partager