Μετάβαση στο περιεχόμενο

XOOPS Εργαλείο δημιουργίας ερωτημάτων

Το XOOPS Εργαλείο δόμησης ερωτημάτων παρέχει μια σύγχρονη, ευχάριστη διεπαφή για τη δημιουργία ερωτημάτων SQL. Βοηθά στην αποτροπή της έγχυσης SQL, βελτιώνει την αναγνωσιμότητα και παρέχει αφαίρεση βάσης δεδομένων για πολλαπλά συστήματα βάσεων δεδομένων.

graph TD
A[QueryBuilder] -->|builds| B[SELECT Queries]
A -->|builds| C[INSERT Queries]
A -->|builds| D[UPDATE Queries]
A -->|builds| E[DELETE Queries]
F[Table] -->|chains| G[select]
F -->|chains| H[where]
F -->|chains| I[orderBy]
F -->|chains| J[limit]
G -->|chains| K[join]
G -->|chains| H
H -->|chains| I
I -->|chains| J
L[Execute Methods] -->|returns| M[Results]
L -->|returns| N[Count]
L -->|returns| O[First/Last]

Η κύρια κλάση του προγράμματος δημιουργίας ερωτημάτων με άπταιστη διεπαφή.

namespace Xoops\Database;
class QueryBuilder
{
protected string $table = '';
protected string $type = 'SELECT';
protected array $selects = [];
protected array $joins = [];
protected array $wheres = [];
protected array $orders = [];
protected int $limit = 0;
protected int $offset = 0;
protected array $bindings = [];
}

Δημιουργεί ένα νέο εργαλείο δημιουργίας ερωτημάτων για έναν πίνακα.

public static function table(string $table): QueryBuilder

Παράμετροι:

ΠαράμετροςΤύποςΠεριγραφή
$tableχορδήΌνομα πίνακα (με ή χωρίς πρόθεμα)

Επιστροφές: QueryBuilder - Παράδειγμα δημιουργίας ερωτημάτων

Παράδειγμα:

$query = QueryBuilder::table('users');
$query = QueryBuilder::table('xoops_users'); // With prefix

Καθορίζει στήλες προς επιλογή.

public function select(...$columns): self

Παράμετροι:

ΠαράμετροςΤύποςΠεριγραφή
...$columnsσυστοιχίαΟνόματα ή εκφράσεις στηλών

Επιστροφές: self - Για αλυσιδοποίηση μεθόδων

Παράδειγμα:

// Simple select
QueryBuilder::table('users')
->select('id', 'username', 'email')
->get();
// Select with aliases
QueryBuilder::table('users')
->select('id as user_id', 'username as name')
->get();
// Select all columns
QueryBuilder::table('users')
->select('*')
->get();
// Select with expressions
QueryBuilder::table('orders')
->select('id', 'COUNT(*) as total_items')
->groupBy('id')
->get();

Προσθέτει μια συνθήκη WHERE.

public function where(string $column, string $operator = '=', mixed $value = null): self

Παράμετροι:

ΠαράμετροςΤύποςΠεριγραφή
$columnχορδήΌνομα στήλης
$operatorχορδήΣύγκριση χειριστή
$valueμικτήΑξία προς σύγκριση

Επιστροφές: self - Για αλυσιδοποίηση μεθόδων

** Χειριστές: **

ΧειριστήςΠεριγραφήΠαράδειγμα
=Ίσο->where('status', '=', 'active')
!= ή <>Όχι ίσο->where('status', '!=', 'deleted')
>Μεγαλύτερο από->where('price', '>', 100)
<Λιγότερο από->where('price', '<', 100)
>=Μεγαλύτερο ή ίσο->where('age', '>=', 18)
<=Λιγότερο ή ίσο->where('age', '<=', 65)
LIKE Ταίριασμα μοτίβου->where('name', 'LIKE', '%john%')
IN Στη λίστα->where('status', 'IN', ['active', 'pending'])
NOT IN Όχι στη λίστα->where('id', 'NOT IN', [1, 2, 3])
BETWEEN Εύρος->where('age', 'BETWEEN', [18, 65])
IS NULL Είναι μηδενικό->where('deleted_at', 'IS NULL')
IS NOT NULL Μη μηδενικό->where('deleted_at', 'IS NOT NULL')

Παράδειγμα:

// Single condition
QueryBuilder::table('users')
->select('*')
->where('status', '=', 'active')
->get();
// Multiple conditions (AND)
QueryBuilder::table('users')
->select('*')
->where('status', '=', 'active')
->where('age', '>=', 18)
->get();
// IN operator
QueryBuilder::table('products')
->select('*')
->where('category_id', 'IN', [1, 2, 3])
->get();
// LIKE operator
QueryBuilder::table('users')
->select('*')
->where('email', 'LIKE', '%@example.com')
->get();
// NULL check
QueryBuilder::table('users')
->select('*')
->where('deleted_at', 'IS NULL')
->get();

Προσθέτει μια συνθήκη OR.

public function orWhere(string $column, string $operator = '=', mixed $value = null): self

Παράδειγμα:

QueryBuilder::table('users')
->select('*')
->where('status', '=', 'active')
->orWhere('premium', '=', 1)
->get();
// SELECT * FROM users WHERE status = 'active' OR premium = 1

Μέθοδοι ευκολίας για IN/NOT IN.

public function whereIn(string $column, array $values): self
public function whereNotIn(string $column, array $values): self

Παράδειγμα:

QueryBuilder::table('posts')
->select('*')
->whereIn('status', ['published', 'scheduled'])
->get();
QueryBuilder::table('comments')
->select('*')
->whereNotIn('spam_score', [8, 9, 10])
->get();

Εύκολες μέθοδοι για ελέγχους NULL.

public function whereNull(string $column): self
public function whereNotNull(string $column): self

Παράδειγμα:

QueryBuilder::table('users')
->select('*')
->whereNotNull('verified_at')
->get();

Ελέγχει εάν η τιμή είναι μεταξύ δύο τιμών.

public function whereBetween(string $column, array $values): self

Παράδειγμα:

QueryBuilder::table('products')
->select('*')
->whereBetween('price', [10, 100])
->get();
QueryBuilder::table('orders')
->select('*')
->whereBetween('created_at', ['2024-01-01', '2024-12-31'])
->get();

Προσθέτει ένα INNER JOIN.

public function join(
string $table,
string $first,
string $operator = '=',
string $second = null
): self

Παράδειγμα:

QueryBuilder::table('posts')
->select('posts.*', 'users.username', 'categories.name')
->join('users', 'posts.user_id', '=', 'users.id')
->join('categories', 'posts.category_id', '=', 'categories.id')
->where('posts.published', '=', 1)
->get();

Εναλλακτικοί τύποι ενώσεων.

public function leftJoin(
string $table,
string $first,
string $operator = '=',
string $second = null
): self
public function rightJoin(
string $table,
string $first,
string $operator = '=',
string $second = null
): self

Παράδειγμα:

QueryBuilder::table('users')
->select('users.*', 'COUNT(posts.id) as post_count')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->groupBy('users.id')
->get();

Ομαδοποιήστε τα αποτελέσματα κατά στήλες.

public function groupBy(...$columns): self

Παράδειγμα:

QueryBuilder::table('orders')
->select('user_id', 'COUNT(*) as order_count', 'SUM(total) as total_spent')
->groupBy('user_id')
->get();
QueryBuilder::table('sales')
->select('department', 'region', 'SUM(amount) as total')
->groupBy('department', 'region')
->get();

Προσθέτει μια συνθήκη HAVING.

public function having(string $column, string $operator = '=', mixed $value = null): self

Παράδειγμα:

QueryBuilder::table('orders')
->select('user_id', 'COUNT(*) as order_count')
->groupBy('user_id')
->having('order_count', '>', 5)
->get();

Αποτελέσματα παραγγελιών.

public function orderBy(string $column, string $direction = 'ASC'): self

Παράμετροι:

ΠαράμετροςΤύποςΠεριγραφή
$columnχορδήΣτήλη κατά παραγγελία κατά
$direction χορδήASC ή DESC

Παράδειγμα:

// Single order
QueryBuilder::table('users')
->select('*')
->orderBy('created_at', 'DESC')
->get();
// Multiple orders
QueryBuilder::table('posts')
->select('*')
->orderBy('category_id', 'ASC')
->orderBy('created_at', 'DESC')
->get();
// Random order
QueryBuilder::table('quotes')
->select('*')
->orderBy('RAND()')
->get();

Περιορίζει και αντισταθμίζει τα αποτελέσματα.

public function limit(int $limit): self
public function offset(int $offset): self

Παράδειγμα:

// Simple limit
QueryBuilder::table('posts')
->select('*')
->limit(10)
->get();
// Pagination
$page = 2;
$perPage = 20;
$offset = ($page - 1) * $perPage;
QueryBuilder::table('posts')
->select('*')
->limit($perPage)
->offset($offset)
->get();

Εκτελεί το ερώτημα και επιστρέφει όλα τα αποτελέσματα.

public function get(): array

Επιστρέφει: array - Πίνακας σειρών αποτελεσμάτων

Παράδειγμα:

$users = QueryBuilder::table('users')
->select('id', 'username', 'email')
->where('status', '=', 'active')
->orderBy('username')
->get();
foreach ($users as $user) {
echo $user['username'] . ' (' . $user['email'] . ')' . "\n";
}

Παίρνει το πρώτο αποτέλεσμα.

public function first(): ?array

Επιστρέφει: ?array - Πρώτη σειρά ή μηδενική

Παράδειγμα:

$user = QueryBuilder::table('users')
->select('*')
->where('id', '=', 123)
->first();
if ($user) {
echo 'Found: ' . $user['username'];
}

Παίρνει το τελευταίο αποτέλεσμα.

public function last(): ?array

Παράδειγμα:

$latestPost = QueryBuilder::table('posts')
->select('*')
->orderBy('created_at', 'DESC')
->last();

Λαμβάνει τον αριθμό των αποτελεσμάτων.

public function count(): int

Επιστροφές: int - Αριθμός σειρών

Παράδειγμα:

$activeUsers = QueryBuilder::table('users')
->where('status', '=', 'active')
->count();
echo "Active users: $activeUsers";

Το ### υπάρχει

Ελέγχει εάν το ερώτημα επιστρέφει αποτελέσματα.

public function exists(): bool

Επιστρέφει: bool - Σωστό εάν υπάρχουν αποτελέσματα

Παράδειγμα:

if (QueryBuilder::table('users')->where('email', '=', 'test@example.com')->exists()) {
echo 'User already exists';
}

Λαμβάνει συγκεντρωτικές τιμές.

public function aggregate(string $function, string $column): mixed

Παράδειγμα:

$maxPrice = QueryBuilder::table('products')
->aggregate('MAX', 'price');
$avgAge = QueryBuilder::table('users')
->aggregate('AVG', 'age');
$totalSales = QueryBuilder::table('orders')
->aggregate('SUM', 'total');

Εισάγει μια σειρά.

public function insert(array $values): bool

Παράδειγμα:

QueryBuilder::table('users')->insert([
'username' => 'john',
'email' => 'john@example.com',
'password' => password_hash('secret', PASSWORD_BCRYPT),
'created_at' => date('Y-m-d H:i:s')
]);

Εισάγει πολλές σειρές.

public function insertMany(array $rows): bool

Παράδειγμα:

QueryBuilder::table('log_entries')->insertMany([
['action' => 'login', 'user_id' => 1, 'timestamp' => time()],
['action' => 'logout', 'user_id' => 2, 'timestamp' => time()],
['action' => 'update', 'user_id' => 3, 'timestamp' => time()]
]);

Ενημερώνει τις σειρές.

public function update(array $values): int

Επιστροφές: int - Αριθμός επηρεαζόμενων σειρών

Παράδειγμα:

// Update single user
QueryBuilder::table('users')
->where('id', '=', 123)
->update([
'email' => 'newemail@example.com',
'updated_at' => date('Y-m-d H:i:s')
]);
// Update multiple rows
QueryBuilder::table('posts')
->where('status', '=', 'draft')
->where('created_at', '<', date('Y-m-d', strtotime('-30 days')))
->update([
'status' => 'archived'
]);

Αυξάνει ή μειώνει μια στήλη.

public function increment(string $column, int $amount = 1): int
public function decrement(string $column, int $amount = 1): int

Παράδειγμα:

// Increment view count
QueryBuilder::table('posts')
->where('id', '=', 123)
->increment('views');
// Decrement stock
QueryBuilder::table('products')
->where('id', '=', 456)
->decrement('stock', 5);

Διαγράφει σειρές.

public function delete(): int

Επιστρέφει: int - Αριθμός διαγραμμένων σειρών

Παράδειγμα:

// Delete single record
QueryBuilder::table('comments')
->where('id', '=', 789)
->delete();
// Delete multiple records
QueryBuilder::table('log_entries')
->where('created_at', '<', date('Y-m-d', strtotime('-30 days')))
->delete();

Διαγράφει όλες τις σειρές από τον πίνακα.

public function truncate(): bool

Παράδειγμα:

// Clear all sessions
QueryBuilder::table('sessions')->truncate();
QueryBuilder::table('products')
->select('id', 'name', QueryBuilder::raw('price * quantity as total'))
->get();
$recentPostIds = QueryBuilder::table('posts')
->select('id')
->where('created_at', '>', date('Y-m-d', strtotime('-7 days')))
->toSql();
$comments = QueryBuilder::table('comments')
->select('*')
->whereIn('post_id', $recentPostIds)
->get();
public function toSql(): string

Παράδειγμα:

$sql = QueryBuilder::table('users')
->select('id', 'username')
->where('status', '=', 'active')
->toSql();
echo $sql;
// SELECT id, username FROM xoops_users WHERE status = ?
<?php
/**
* Get posts with author and category info
*/
$posts = QueryBuilder::table('posts')
->select(
'posts.id',
'posts.title',
'posts.content',
'posts.created_at',
'users.username as author',
'categories.name as category'
)
->join('users', 'posts.user_id', '=', 'users.id')
->join('categories', 'posts.category_id', '=', 'categories.id')
->where('posts.published', '=', 1)
->orderBy('posts.created_at', 'DESC')
->limit(10)
->get();
foreach ($posts as $post) {
echo '<article>';
echo '<h2>' . htmlspecialchars($post['title']) . '</h2>';
echo '<p class="meta">By ' . htmlspecialchars($post['author']) . ' in ' . htmlspecialchars($post['category']) . '</p>';
echo '<p>' . htmlspecialchars($post['content']) . '</p>';
echo '</article>';
}
<?php
/**
* Paginated results
*/
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$perPage = 20;
$offset = ($page - 1) * $perPage;
// Get total count
$total = QueryBuilder::table('articles')
->where('status', '=', 'published')
->count();
// Get page results
$articles = QueryBuilder::table('articles')
->select('*')
->where('status', '=', 'published')
->orderBy('created_at', 'DESC')
->limit($perPage)
->offset($offset)
->get();
// Calculate pagination
$pages = ceil($total / $perPage);
// Display results
foreach ($articles as $article) {
echo '<div class="article">' . htmlspecialchars($article['title']) . '</div>';
}
// Display pagination links
if ($pages > 1) {
echo '<nav class="pagination">';
for ($i = 1; $i <= $pages; $i++) {
if ($i == $page) {
echo '<span class="current">' . $i . '</span>';
} else {
echo '<a href="?page=' . $i . '">' . $i . '</a>';
}
}
echo '</nav>';
}

# Ανάλυση δεδομένων με συγκεντρωτικά στοιχεία

Ενότητα με τίτλο «# Ανάλυση δεδομένων με συγκεντρωτικά στοιχεία»
<?php
/**
* Sales analysis
*/
// Total sales by region
$regionSales = QueryBuilder::table('orders')
->select('region', QueryBuilder::raw('SUM(total) as total_sales'), QueryBuilder::raw('COUNT(*) as order_count'))
->groupBy('region')
->orderBy('total_sales', 'DESC')
->get();
foreach ($regionSales as $region) {
echo $region['region'] . ': $' . number_format($region['total_sales'], 2) . ' (' . $region['order_count'] . ' orders)' . "\n";
}
// Average order value
$avgOrderValue = QueryBuilder::table('orders')
->aggregate('AVG', 'total');
echo 'Average order value: $' . number_format($avgOrderValue, 2);
  1. Χρήση παραμετροποιημένων ερωτημάτων - Το QueryBuilder χειρίζεται αυτόματα τη σύνδεση παραμέτρων
  2. Μέθοδοι αλυσίδας - Αξιοποιήστε τη ρευστική διεπαφή για αναγνώσιμο κώδικα
  3. Δοκιμή SQL Έξοδος - Χρησιμοποιήστε το toSql() για να επαληθεύσετε τα ερωτήματα που δημιουργούνται
  4. Χρήση ευρετηρίων - Βεβαιωθείτε ότι οι στήλες με τα συχνά ερωτήματα είναι ευρετηριασμένες
  5. Περιορισμός αποτελεσμάτων - Να χρησιμοποιείτε πάντα limit() για μεγάλα σύνολα δεδομένων
  6. Χρησιμοποιήστε Aggregates - Αφήστε τη βάση δεδομένων να κάνει counting/summing αντί για PHP
  7. Έξοδος διαφυγής - Να γίνεται πάντα διαφυγή από τα εμφανιζόμενα δεδομένα με το htmlspecialchars()
  8. Απόδοση ευρετηρίου - Παρακολουθήστε αργά ερωτήματα και βελτιστοποιήστε ανάλογα
  • XoopsDatabase - Επίπεδο βάσης δεδομένων και συνδέσεις
  • Κριτήρια - Σύστημα ερωτημάτων που βασίζεται σε κριτήρια παλαιού τύπου
  • ../Core/XoopsObject - Εμμονή αντικειμένου δεδομένων
  • ../Module/Module-System - Λειτουργίες βάσης δεδομένων μονάδας

Δείτε επίσης: XOOPS Βάση δεδομένων API