Move more select * to column select for further optimization

This commit is contained in:
johnnyq
2026-08-06 13:44:02 -04:00
parent b3744e9ed5
commit 108781db5b
37 changed files with 107 additions and 52 deletions

View File

@@ -178,7 +178,8 @@ A user can be restricted to a subset of clients through `user_client_permissions
**A list — `clientScopeSql()`.** Any query returning more than one row appends the fragment for that resource's own client column: **A list — `clientScopeSql()`.** Any query returning more than one row appends the fragment for that resource's own client column:
```php ```php
$sql = mysqli_query($mysqli, "SELECT * FROM expenses $sql = mysqli_query($mysqli, "SELECT expense_id, expense_date, expense_amount, expense_description
FROM expenses
WHERE expense_archived_at IS NULL WHERE expense_archived_at IS NULL
" . clientScopeSql('expense_client_id') . " " . clientScopeSql('expense_client_id') . "
ORDER BY expense_date DESC"); ORDER BY expense_date DESC");
@@ -224,7 +225,26 @@ Per [SECURITY.md](SECURITY.md) — never in a public issue.
## Conventions ## Conventions
**Database naming.** Every column is prefixed with the singular name of the entity it belongs to: `tickets.ticket_id`, `tickets.ticket_subject`, `clients.client_name`. This makes JOIN results unambiguous and is why queries can `SELECT *` across joins safely. New tables must follow it. **Database naming.** Every column is prefixed with the singular name of the entity it belongs to: `tickets.ticket_id`, `tickets.ticket_subject`, `clients.client_name`. This makes JOIN results unambiguous, so a `SELECT *` across joins is never *wrong*. New tables must follow it.
**Select the columns you use, not `*`.** Unambiguous is not the same as cheap. `SELECT *` across three joined tables fetches every column of all three, including the `*_notes` and `*_details` TEXT columns, and throws away whatever the page never renders. A search result list that shows five fields was pulling sixty. List the columns instead:
```php
$sql = mysqli_query($mysqli, "SELECT ticket_id, ticket_prefix, ticket_number, ticket_subject, client_name
FROM tickets
LEFT JOIN clients ON ticket_client_id = client_id
WHERE ticket_archived_at IS NULL
" . clientScopeSql('ticket_client_id') . "");
```
Two things follow from that:
- A query whose result only feeds `mysqli_num_rows()` needs no columns at all — write `SELECT 1`. Do not select a primary key "just in case": if the query joins two tables that both carry that column name, an unqualified `SELECT ticket_template_id` is an ambiguous-column error.
- Keep the join even when no column of the joined table survives into the `SELECT`, if the join is doing work — supplying a `WHERE` term, an `ORDER BY`, or the client column you scope on. Dropping a join is a separate decision from trimming the column list.
The trade is real and worth stating: `SELECT *` picks up new columns for free, an explicit list does not. Add a column to a table and every query that needs it must be updated by hand, and the failure mode is a blank field or a PHP 8 undefined-key warning rather than an error. That is the price of not fetching data nobody reads, and the project has decided to pay it on anything that loops or touches a TEXT column.
The exception is `api/v1/*/read.php`. Those endpoints hand the whole row to `read_output.php`, which serialises it straight into the JSON response — there the row *is* the output contract, so `SELECT *` is correct and trimming it would silently drop fields from every consumer.
The prefix is the entity name, which is usually but not always the singular of the table name. Where a table is named for its container rather than its row, the prefix follows the row: `calendar_events``event_*`, `asset_interfaces``interface_*`, `invoice_items` / `quote_items``item_*`, `rack_units``unit_*`, `user_roles``role_*`, `product_stock``stock_*`. Pick the prefix your columns will read best as and use it for every column in the table. The prefix is the entity name, which is usually but not always the singular of the table name. Where a table is named for its container rather than its row, the prefix follows the row: `calendar_events``event_*`, `asset_interfaces``interface_*`, `invoice_items` / `quote_items``item_*`, `rack_units``unit_*`, `user_roles``role_*`, `product_stock``stock_*`. Pick the prefix your columns will read best as and use it for every column in the table.

View File

@@ -6,7 +6,7 @@ $order = "ASC";
require_once "includes/inc_all_admin.php"; require_once "includes/inc_all_admin.php";
$sql = mysqli_query($mysqli, "SELECT * FROM ai_providers ORDER BY $sort $order"); $sql = mysqli_query($mysqli, "SELECT ai_provider_api_key, ai_provider_api_url, ai_provider_id, ai_provider_name FROM ai_providers ORDER BY $sort $order");
$num_rows = mysqli_num_rows($sql); $num_rows = mysqli_num_rows($sql);

View File

@@ -12,13 +12,13 @@ $user_email = escapeHtml($row['user_email']);
$user_avatar = escapeHtml($row['user_avatar']); $user_avatar = escapeHtml($row['user_avatar']);
$user_initials = escapeHtml(initials($user_name)); $user_initials = escapeHtml(initials($user_name));
$sql_related_tickets = mysqli_query($mysqli, "SELECT * FROM tickets $sql_related_tickets = mysqli_query($mysqli, "SELECT 1 FROM tickets
WHERE ticket_assigned_to = $user_id AND ticket_resolved_at IS NULL AND ticket_closed_at IS NULL"); WHERE ticket_assigned_to = $user_id AND ticket_resolved_at IS NULL AND ticket_closed_at IS NULL");
$ticket_count = mysqli_num_rows($sql_related_tickets); $ticket_count = mysqli_num_rows($sql_related_tickets);
// Related Recurring Tickets Query // Related Recurring Tickets Query
$sql_related_recurring_tickets = mysqli_query($mysqli, "SELECT * FROM recurring_tickets WHERE recurring_ticket_assigned_to = $user_id"); $sql_related_recurring_tickets = mysqli_query($mysqli, "SELECT 1 FROM recurring_tickets WHERE recurring_ticket_assigned_to = $user_id");
$recurring_ticket_count = mysqli_num_rows($sql_related_recurring_tickets); $recurring_ticket_count = mysqli_num_rows($sql_related_recurring_tickets);

View File

@@ -6,7 +6,8 @@ $order = "ASC";
require_once "includes/inc_all_admin.php"; require_once "includes/inc_all_admin.php";
$sql = mysqli_query($mysqli, "SELECT * FROM payment_providers $sql = mysqli_query($mysqli, "SELECT account_name, category_name, payment_provider_description, payment_provider_id,
payment_provider_name, payment_provider_threshold, vendor_name FROM payment_providers
LEFT JOIN accounts ON payment_provider_account = account_id LEFT JOIN accounts ON payment_provider_account = account_id
LEFT JOIN vendors ON payment_provider_expense_vendor = vendor_id LEFT JOIN vendors ON payment_provider_expense_vendor = vendor_id
LEFT JOIN categories ON payment_provider_expense_category = category_id LEFT JOIN categories ON payment_provider_expense_category = category_id

View File

@@ -8,7 +8,8 @@ require_once "includes/inc_all_admin.php";
$sql = mysqli_query( $sql = mysqli_query(
$mysqli, $mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM users "SELECT SQL_CALC_FOUND_ROWS role_name, user_archived_at, user_avatar, user_config_force_mfa, user_email,
user_settings.user_id, user_name, user_role_id, user_status, user_token FROM users
LEFT JOIN user_roles ON user_role_id = role_id LEFT JOIN user_roles ON user_role_id = role_id
LEFT JOIN user_settings ON users.user_id = user_settings.user_id LEFT JOIN user_settings ON users.user_id = user_settings.user_id
WHERE (user_name LIKE '%$q%' OR user_email LIKE '%$q%') WHERE (user_name LIKE '%$q%' OR user_email LIKE '%$q%')

View File

@@ -11,7 +11,7 @@ enforceUserPermission('module_financial');
$sql = mysqli_query( $sql = mysqli_query(
$mysqli, $mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM accounts "SELECT SQL_CALC_FOUND_ROWS account_currency_code, account_id, account_name, account_notes, opening_balance FROM accounts
WHERE (account_name LIKE '%$q%') WHERE (account_name LIKE '%$q%')
AND account_archived_at IS NULL AND account_archived_at IS NULL
ORDER BY $sort $order LIMIT $record_from, $record_to" ORDER BY $sort $order LIMIT $record_from, $record_to"

View File

@@ -122,7 +122,7 @@ if (isset($_GET['asset_id'])) {
$recurring_ticket_count = mysqli_num_rows($sql_related_recurring_tickets); $recurring_ticket_count = mysqli_num_rows($sql_related_recurring_tickets);
// Related Documents // Related Documents
$sql_related_documents = mysqli_query($mysqli, "SELECT * FROM asset_documents $sql_related_documents = mysqli_query($mysqli, "SELECT 1 FROM asset_documents
LEFT JOIN documents ON asset_documents.document_id = documents.document_id LEFT JOIN documents ON asset_documents.document_id = documents.document_id
WHERE asset_documents.asset_id = $asset_id WHERE asset_documents.asset_id = $asset_id
AND document_archived_at IS NULL AND document_archived_at IS NULL
@@ -252,7 +252,9 @@ if (isset($_GET['asset_id'])) {
// Related Software Query // Related Software Query
$sql_related_software = mysqli_query( $sql_related_software = mysqli_query(
$mysqli, $mysqli,
"SELECT * FROM software_assets "SELECT software_expire, software_assets.software_id, software_key, software_license_type,
software_name, software_notes, software_purchase, software_seats, software_type,
software_version FROM software_assets
LEFT JOIN software ON software_assets.software_id = software.software_id LEFT JOIN software ON software_assets.software_id = software.software_id
WHERE software_assets.asset_id = $asset_id WHERE software_assets.asset_id = $asset_id
AND software_archived_at IS NULL AND software_archived_at IS NULL

View File

@@ -641,7 +641,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
$location_name_display = $location_name; $location_name_display = $location_name;
} }
$sql_credentials = mysqli_query($mysqli, "SELECT * FROM credentials WHERE credential_asset_id = $asset_id"); $sql_credentials = mysqli_query($mysqli, "SELECT 1 FROM credentials WHERE credential_asset_id = $asset_id");
$credential_count = mysqli_num_rows($sql_credentials); $credential_count = mysqli_num_rows($sql_credentials);
// Tags // Tags

View File

@@ -83,7 +83,9 @@ if (isset($_GET['contact_id'])) {
$asset_count = mysqli_num_rows($sql_related_assets); $asset_count = mysqli_num_rows($sql_related_assets);
// Linked Software Licenses // Linked Software Licenses
$sql_linked_software = mysqli_query($mysqli, "SELECT * FROM software_contacts, software $sql_linked_software = mysqli_query($mysqli, "SELECT software_expire, software_contacts.software_id, software_key, software_license_type,
software_name, software_notes, software_purchase, software_seats, software_type,
software_version FROM software_contacts, software
WHERE software_contacts.contact_id = $contact_id WHERE software_contacts.contact_id = $contact_id
AND software_contacts.software_id = software.software_id AND software_contacts.software_id = software.software_id
AND software_archived_at IS NULL AND software_archived_at IS NULL

View File

@@ -117,7 +117,7 @@ if ($user_config_dashboard_financial_enable == 1) {
$profit = $total_income - $total_expenses; $profit = $total_income - $total_expenses;
$sql_accounts = mysqli_query($mysqli, "SELECT * FROM accounts WHERE account_archived_at IS NULL ORDER BY account_name ASC"); $sql_accounts = mysqli_query($mysqli, "SELECT account_id, account_name, opening_balance FROM accounts WHERE account_archived_at IS NULL ORDER BY account_name ASC");
$sql_latest_invoice_payments = mysqli_query($mysqli, " $sql_latest_invoice_payments = mysqli_query($mysqli, "
SELECT client_name, invoice_number, invoice_prefix, payment_amount, payment_date FROM payments SELECT client_name, invoice_number, invoice_prefix, payment_amount, payment_date FROM payments

View File

@@ -130,8 +130,7 @@ if (isset($_GET['invoice_id'])) {
//Get billable, and unbilled tickets to add to invoice //Get billable, and unbilled tickets to add to invoice
$sql_tickets_billable = mysqli_query( $sql_tickets_billable = mysqli_query(
$mysqli, " $mysqli, "
SELECT SELECT 1
*
FROM FROM
tickets tickets
WHERE WHERE
@@ -199,7 +198,7 @@ if (isset($_GET['invoice_id'])) {
// Saved Payment Methods // Saved Payment Methods
$sql_saved_payment_methods = mysqli_query($mysqli, " $sql_saved_payment_methods = mysqli_query($mysqli, "
SELECT * FROM client_saved_payment_methods SELECT 1 FROM client_saved_payment_methods
LEFT JOIN payment_providers LEFT JOIN payment_providers
ON client_saved_payment_methods.saved_payment_provider_id = payment_providers.payment_provider_id ON client_saved_payment_methods.saved_payment_provider_id = payment_providers.payment_provider_id
WHERE saved_payment_client_id = $client_id WHERE saved_payment_client_id = $client_id

View File

@@ -219,7 +219,9 @@ $file_count = mysqli_num_rows($sql_related_files);
// Related Software Query // Related Software Query
$sql_related_software = mysqli_query( $sql_related_software = mysqli_query(
$mysqli, $mysqli,
"SELECT * FROM software_assets "SELECT software_expire, software_assets.software_id, software_key, software_license_type,
software_name, software_notes, software_purchase, software_seats, software_type,
software_version FROM software_assets
LEFT JOIN software ON software_assets.software_id = software.software_id LEFT JOIN software ON software_assets.software_id = software.software_id
WHERE software_assets.asset_id = $asset_id WHERE software_assets.asset_id = $asset_id
AND software_archived_at IS NULL AND software_archived_at IS NULL

View File

@@ -158,7 +158,7 @@ while ($row = mysqli_fetch_assoc($sql_note_type_icons)) {
} }
// Linked Services // Linked Services
$sql_linked_services = mysqli_query($mysqli, "SELECT * FROM service_contacts, services $sql_linked_services = mysqli_query($mysqli, "SELECT 1 FROM service_contacts, services
WHERE service_contacts.contact_id = $contact_id WHERE service_contacts.contact_id = $contact_id
AND service_contacts.service_id = services.service_id AND service_contacts.service_id = services.service_id
ORDER BY service_name ASC" ORDER BY service_name ASC"

View File

@@ -93,7 +93,7 @@ ob_start();
<option value="">- Select an Account -</option> <option value="">- Select an Account -</option>
<?php <?php
$sql = mysqli_query($mysqli, "SELECT * FROM accounts WHERE account_archived_at IS NULL ORDER BY account_name ASC"); $sql = mysqli_query($mysqli, "SELECT account_currency_code, account_id, account_name, opening_balance FROM accounts WHERE account_archived_at IS NULL ORDER BY account_name ASC");
while ($row = mysqli_fetch_assoc($sql)) { while ($row = mysqli_fetch_assoc($sql)) {
$account_id = intval($row['account_id']); $account_id = intval($row['account_id']);
$account_name = escapeHtml($row['account_name']); $account_name = escapeHtml($row['account_name']);

View File

@@ -95,7 +95,7 @@ ob_start();
<option value="">- Select an Account -</option> <option value="">- Select an Account -</option>
<?php <?php
$sql = mysqli_query($mysqli, "SELECT * FROM accounts WHERE account_archived_at IS NULL ORDER BY account_name ASC"); $sql = mysqli_query($mysqli, "SELECT account_id, account_name, opening_balance FROM accounts WHERE account_archived_at IS NULL ORDER BY account_name ASC");
while ($row = mysqli_fetch_assoc($sql)) { while ($row = mysqli_fetch_assoc($sql)) {
$account_id = intval($row['account_id']); $account_id = intval($row['account_id']);
$account_name = escapeHtml($row['account_name']); $account_name = escapeHtml($row['account_name']);

View File

@@ -75,7 +75,7 @@ ob_start();
<option value="">- Select an Account -</option> <option value="">- Select an Account -</option>
<?php <?php
$sql = mysqli_query($mysqli, "SELECT * FROM accounts WHERE account_archived_at IS NULL ORDER BY account_name ASC"); $sql = mysqli_query($mysqli, "SELECT account_id, account_name, opening_balance FROM accounts WHERE account_archived_at IS NULL ORDER BY account_name ASC");
while ($row = mysqli_fetch_assoc($sql)) { while ($row = mysqli_fetch_assoc($sql)) {
$account_id = intval($row['account_id']); $account_id = intval($row['account_id']);
$account_name = escapeHtml($row['account_name']); $account_name = escapeHtml($row['account_name']);

View File

@@ -51,7 +51,7 @@ ob_start();
<option value="">- Account -</option> <option value="">- Account -</option>
<?php <?php
$sql = mysqli_query($mysqli, "SELECT * FROM accounts WHERE account_archived_at IS NULL ORDER BY account_name ASC"); $sql = mysqli_query($mysqli, "SELECT account_currency_code, account_id, account_name, opening_balance FROM accounts WHERE account_archived_at IS NULL ORDER BY account_name ASC");
while ($row = mysqli_fetch_assoc($sql)) { while ($row = mysqli_fetch_assoc($sql)) {
$account_id = intval($row['account_id']); $account_id = intval($row['account_id']);
$account_name = escapeHtml($row['account_name']); $account_name = escapeHtml($row['account_name']);

View File

@@ -72,7 +72,7 @@ ob_start();
<option value="">- Select Account -</option> <option value="">- Select Account -</option>
<?php <?php
$sql_accounts = mysqli_query($mysqli, "SELECT * FROM accounts WHERE (account_archived_at > '$revenue_created_at' OR account_archived_at IS NULL) ORDER BY account_archived_at ASC, account_name ASC"); $sql_accounts = mysqli_query($mysqli, "SELECT account_archived_at, account_currency_code, account_id, account_name, opening_balance FROM accounts WHERE (account_archived_at > '$revenue_created_at' OR account_archived_at IS NULL) ORDER BY account_archived_at ASC, account_name ASC");
while ($row = mysqli_fetch_assoc($sql_accounts)) { while ($row = mysqli_fetch_assoc($sql_accounts)) {
$account_id_select = intval($row['account_id']); $account_id_select = intval($row['account_id']);
$account_name_select = escapeHtml($row['account_name']); $account_name_select = escapeHtml($row['account_name']);

View File

@@ -50,7 +50,7 @@ ob_start();
<option value="">- Account From -</option> <option value="">- Account From -</option>
<?php <?php
$sql = mysqli_query($mysqli, "SELECT * FROM accounts WHERE account_archived_at IS NULL ORDER BY account_name ASC"); $sql = mysqli_query($mysqli, "SELECT account_id, account_name, opening_balance FROM accounts WHERE account_archived_at IS NULL ORDER BY account_name ASC");
while ($row = mysqli_fetch_assoc($sql)) { while ($row = mysqli_fetch_assoc($sql)) {
$account_id = intval($row['account_id']); $account_id = intval($row['account_id']);
$account_name = escapeHtml($row['account_name']); $account_name = escapeHtml($row['account_name']);
@@ -88,7 +88,7 @@ ob_start();
<option value="">- Account To -</option> <option value="">- Account To -</option>
<?php <?php
$sql = mysqli_query($mysqli, "SELECT * FROM accounts WHERE account_archived_at IS NULL ORDER BY account_name ASC"); $sql = mysqli_query($mysqli, "SELECT account_id, account_name, opening_balance FROM accounts WHERE account_archived_at IS NULL ORDER BY account_name ASC");
while ($row = mysqli_fetch_assoc($sql)) { while ($row = mysqli_fetch_assoc($sql)) {
$account_id = intval($row['account_id']); $account_id = intval($row['account_id']);
$account_name = escapeHtml($row['account_name']); $account_name = escapeHtml($row['account_name']);

View File

@@ -75,7 +75,7 @@ ob_start();
<select class="form-control select2" name="account_from" required> <select class="form-control select2" name="account_from" required>
<?php <?php
$sql_accounts = mysqli_query($mysqli, "SELECT * FROM accounts WHERE (account_archived_at > '$transfer_created_at' OR account_archived_at IS NULL) ORDER BY account_archived_at ASC, account_name ASC"); $sql_accounts = mysqli_query($mysqli, "SELECT account_archived_at, account_id, account_name, opening_balance FROM accounts WHERE (account_archived_at > '$transfer_created_at' OR account_archived_at IS NULL) ORDER BY account_archived_at ASC, account_name ASC");
while ($row = mysqli_fetch_assoc($sql_accounts)) { while ($row = mysqli_fetch_assoc($sql_accounts)) {
$account_id_select = intval($row['account_id']); $account_id_select = intval($row['account_id']);
$account_name_select = escapeHtml($row['account_name']); $account_name_select = escapeHtml($row['account_name']);
@@ -119,7 +119,7 @@ ob_start();
<select class="form-control select2" name="account_to" required> <select class="form-control select2" name="account_to" required>
<?php <?php
$sql2 = mysqli_query($mysqli, "SELECT * FROM accounts WHERE (account_archived_at > '$transfer_created_at' OR account_archived_at IS NULL) ORDER BY account_archived_at ASC, account_name ASC"); $sql2 = mysqli_query($mysqli, "SELECT account_archived_at, account_id, account_name, opening_balance FROM accounts WHERE (account_archived_at > '$transfer_created_at' OR account_archived_at IS NULL) ORDER BY account_archived_at ASC, account_name ASC");
while ($row = mysqli_fetch_assoc($sql2)) { while ($row = mysqli_fetch_assoc($sql2)) {
$account_id2 = intval($row['account_id']); $account_id2 = intval($row['account_id']);
$account_name = escapeHtml($row['account_name']); $account_name = escapeHtml($row['account_name']);

View File

@@ -111,7 +111,7 @@ if (isset($_POST['edit_asset'])) {
mysqli_query($mysqli,"UPDATE assets SET asset_name = '$name', asset_description = '$description', asset_type = '$type', asset_make = '$make', asset_model = '$model', asset_serial = '$serial', asset_os = '$os', asset_uri = '$uri', asset_uri_2 = '$uri_2', asset_uri_client = '$uri_client', asset_location_id = $location, asset_vendor_id = $vendor, asset_contact_id = $contact, asset_status = '$status', asset_purchase_reference = '$purchase_reference', asset_purchase_date = $purchase_date, asset_warranty_expire = $warranty_expire, asset_install_date = $install_date, asset_physical_location = '$physical_location', asset_notes = '$notes', asset_favorite = $favorite WHERE asset_id = $asset_id"); mysqli_query($mysqli,"UPDATE assets SET asset_name = '$name', asset_description = '$description', asset_type = '$type', asset_make = '$make', asset_model = '$model', asset_serial = '$serial', asset_os = '$os', asset_uri = '$uri', asset_uri_2 = '$uri_2', asset_uri_client = '$uri_client', asset_location_id = $location, asset_vendor_id = $vendor, asset_contact_id = $contact, asset_status = '$status', asset_purchase_reference = '$purchase_reference', asset_purchase_date = $purchase_date, asset_warranty_expire = $warranty_expire, asset_install_date = $install_date, asset_physical_location = '$physical_location', asset_notes = '$notes', asset_favorite = $favorite WHERE asset_id = $asset_id");
$sql_interfaces = mysqli_query($mysqli, "SELECT * FROM asset_interfaces WHERE interface_asset_id = $asset_id AND interface_primary = 1"); $sql_interfaces = mysqli_query($mysqli, "SELECT 1 FROM asset_interfaces WHERE interface_asset_id = $asset_id AND interface_primary = 1");
if(mysqli_num_rows($sql_interfaces) == 0 ) { if(mysqli_num_rows($sql_interfaces) == 0 ) {
// Add Primary Interface // Add Primary Interface
@@ -1174,7 +1174,7 @@ if (isset($_POST["import_assets_csv"])) {
// Name // Name
if (isset($column[0])) { if (isset($column[0])) {
$name = escapeSql($column[0]); $name = escapeSql($column[0]);
if (mysqli_num_rows(mysqli_query($mysqli,"SELECT * FROM assets WHERE asset_name = '$name' AND asset_client_id = $client_id")) > 0) { if (mysqli_num_rows(mysqli_query($mysqli,"SELECT 1 FROM assets WHERE asset_name = '$name' AND asset_client_id = $client_id")) > 0) {
$duplicate_detect = 1; $duplicate_detect = 1;
} }
} }

View File

@@ -528,7 +528,7 @@ if (isset($_POST["import_clients_csv"])) {
$duplicate_detect = 0; $duplicate_detect = 0;
if (isset($column[0])) { if (isset($column[0])) {
$name = escapeSql($column[0]); $name = escapeSql($column[0]);
if (mysqli_num_rows(mysqli_query($mysqli,"SELECT * FROM clients WHERE client_name = '$name'")) > 0) { if (mysqli_num_rows(mysqli_query($mysqli,"SELECT 1 FROM clients WHERE client_name = '$name'")) > 0) {
$duplicate_detect = 1; $duplicate_detect = 1;
} }
} }
@@ -1245,7 +1245,7 @@ if (isset($_POST["export_client_pdf"])) {
$sql_locations = mysqli_query($mysqli, "SELECT * FROM locations WHERE location_client_id = $client_id AND location_archived_at IS NULL ORDER BY location_name ASC"); $sql_locations = mysqli_query($mysqli, "SELECT * FROM locations WHERE location_client_id = $client_id AND location_archived_at IS NULL ORDER BY location_name ASC");
$sql_vendors = mysqli_query($mysqli, "SELECT * FROM vendors WHERE vendor_client_id = $client_id AND vendor_archived_at IS NULL ORDER BY vendor_name ASC"); $sql_vendors = mysqli_query($mysqli, "SELECT * FROM vendors WHERE vendor_client_id = $client_id AND vendor_archived_at IS NULL ORDER BY vendor_name ASC");
$sql_credentials = mysqli_query($mysqli, "SELECT * FROM credentials WHERE credential_client_id = $client_id ORDER BY credential_name ASC"); $sql_credentials = mysqli_query($mysqli, "SELECT * FROM credentials WHERE credential_client_id = $client_id ORDER BY credential_name ASC");
$sql_assets = mysqli_query($mysqli, "SELECT * FROM assets $sql_assets = mysqli_query($mysqli, "SELECT 1 FROM assets
LEFT JOIN contacts ON asset_contact_id = contact_id LEFT JOIN contacts ON asset_contact_id = contact_id
LEFT JOIN locations ON asset_location_id = location_id LEFT JOIN locations ON asset_location_id = location_id
LEFT JOIN asset_interfaces ON interface_asset_id = asset_id AND interface_primary = 1 LEFT JOIN asset_interfaces ON interface_asset_id = asset_id AND interface_primary = 1

View File

@@ -1428,7 +1428,7 @@ if (isset($_POST["import_contacts_csv"])) {
$duplicate_detect = 0; $duplicate_detect = 0;
if (isset($column[0])) { if (isset($column[0])) {
$name = escapeSql($column[0]); $name = escapeSql($column[0]);
if (mysqli_num_rows(mysqli_query($mysqli,"SELECT * FROM contacts WHERE contact_name = '$name' AND contact_client_id = $client_id")) > 0) { if (mysqli_num_rows(mysqli_query($mysqli,"SELECT 1 FROM contacts WHERE contact_name = '$name' AND contact_client_id = $client_id")) > 0) {
$duplicate_detect = 1; $duplicate_detect = 1;
} }
} }

View File

@@ -584,7 +584,7 @@ if (isset($_POST["import_credentials_csv"])) {
// Name // Name
if (isset($column[0])) { if (isset($column[0])) {
$name = escapeSql($column[0]); $name = escapeSql($column[0]);
if (mysqli_num_rows(mysqli_query($mysqli,"SELECT * FROM credentials WHERE credential_name = '$name' AND credential_client_id = $client_id")) > 0){ if (mysqli_num_rows(mysqli_query($mysqli,"SELECT 1 FROM credentials WHERE credential_name = '$name' AND credential_client_id = $client_id")) > 0){
$duplicate_detect = 1; $duplicate_detect = 1;
} }
} }

View File

@@ -541,7 +541,7 @@ if (isset($_POST["import_locations_csv"])) {
$duplicate_detect = 0; $duplicate_detect = 0;
if(isset($column[0])){ if(isset($column[0])){
$name = escapeSql($column[0]); $name = escapeSql($column[0]);
if(mysqli_num_rows(mysqli_query($mysqli,"SELECT * FROM locations WHERE location_name = '$name' AND location_client_id = $client_id")) > 0){ if(mysqli_num_rows(mysqli_query($mysqli,"SELECT 1 FROM locations WHERE location_name = '$name' AND location_client_id = $client_id")) > 0){
$duplicate_detect = 1; $duplicate_detect = 1;
} }
} }

View File

@@ -45,7 +45,8 @@ if (isset($_POST['add_project'])) {
// If project template is selected add Ticket Templates and convert them to real tickets // If project template is selected add Ticket Templates and convert them to real tickets
if($project_template_id) { if($project_template_id) {
// Get Associated Ticket Templates // Get Associated Ticket Templates
$sql_ticket_templates = mysqli_query($mysqli, "SELECT * FROM ticket_templates, project_template_ticket_templates $sql_ticket_templates = mysqli_query($mysqli, "SELECT ticket_template_details, project_template_ticket_templates.ticket_template_id,
ticket_template_order, ticket_template_subject FROM ticket_templates, project_template_ticket_templates
WHERE ticket_templates.ticket_template_id = project_template_ticket_templates.ticket_template_id WHERE ticket_templates.ticket_template_id = project_template_ticket_templates.ticket_template_id
AND project_template_ticket_templates.project_template_id = $project_template_id"); AND project_template_ticket_templates.project_template_id = $project_template_id");
$ticket_template_count = mysqli_num_rows($sql_ticket_templates); $ticket_template_count = mysqli_num_rows($sql_ticket_templates);

View File

@@ -211,7 +211,7 @@ if (isset($_POST['add_rack_unit'])) {
} }
// Check if the unit range is already occupied // Check if the unit range is already occupied
$check_sql = mysqli_query($mysqli, "SELECT * FROM rack_units WHERE unit_rack_id = $rack_id AND unit_start_number <= $unit_end AND unit_end_number >= $unit_start"); $check_sql = mysqli_query($mysqli, "SELECT 1 FROM rack_units WHERE unit_rack_id = $rack_id AND unit_start_number <= $unit_end AND unit_end_number >= $unit_start");
if (mysqli_num_rows($check_sql) > 0) { if (mysqli_num_rows($check_sql) > 0) {
// If there is an overlap, return an error message; // If there is an overlap, return an error message;

View File

@@ -436,7 +436,8 @@ if (isset($_GET['force_recurring'])) {
$new_invoice_id = mysqli_insert_id($mysqli); $new_invoice_id = mysqli_insert_id($mysqli);
//Copy Items from original invoice to new invoice //Copy Items from original invoice to new invoice
$sql_invoice_items = mysqli_query($mysqli,"SELECT * FROM recurring_invoice_items WHERE item_recurring_invoice_id = $recurring_invoice_id ORDER BY item_id ASC"); $sql_invoice_items = mysqli_query($mysqli,"SELECT item_description, item_id, item_name, item_order, item_price, item_quantity, item_subtotal,
item_tax_id FROM recurring_invoice_items WHERE item_recurring_invoice_id = $recurring_invoice_id ORDER BY item_id ASC");
while($row = mysqli_fetch_assoc($sql_invoice_items)) { while($row = mysqli_fetch_assoc($sql_invoice_items)) {
$item_id = intval($row['item_id']); $item_id = intval($row['item_id']);

View File

@@ -84,7 +84,10 @@ if (isset($_GET['project_id'])) {
$page_title = $row['project_name']; $page_title = $row['project_name'];
// Get Tickets // Get Tickets
$sql_tickets = mysqli_query($mysqli, "SELECT * FROM tickets $sql_tickets = mysqli_query($mysqli, "SELECT client_id, client_name, ticket_assigned_to, ticket_billable, ticket_closed_at,
ticket_created_at, ticket_id, ticket_number, ticket_prefix, ticket_priority,
ticket_project_id, ticket_status, ticket_status_color, ticket_status_name, ticket_subject,
ticket_updated_at, user_name FROM tickets
LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id
LEFT JOIN clients ON ticket_client_id = client_id LEFT JOIN clients ON ticket_client_id = client_id
LEFT JOIN users ON ticket_assigned_to = user_id LEFT JOIN users ON ticket_assigned_to = user_id
@@ -94,11 +97,11 @@ if (isset($_GET['project_id'])) {
$ticket_count = mysqli_num_rows($sql_tickets); $ticket_count = mysqli_num_rows($sql_tickets);
// Get Closed Ticket Count // Get Closed Ticket Count
$sql_closed_tickets = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_project_id = $project_id AND ticket_closed_at IS NOT NULL"); $sql_closed_tickets = mysqli_query($mysqli, "SELECT 1 FROM tickets WHERE ticket_project_id = $project_id AND ticket_closed_at IS NOT NULL");
$closed_ticket_count = mysqli_num_rows($sql_closed_tickets); $closed_ticket_count = mysqli_num_rows($sql_closed_tickets);
// Get Resolved Ticket Count // Get Resolved Ticket Count
$sql_resolved_tickets = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_project_id = $project_id AND ticket_resolved_at IS NOT NULL"); $sql_resolved_tickets = mysqli_query($mysqli, "SELECT 1 FROM tickets WHERE ticket_project_id = $project_id AND ticket_resolved_at IS NOT NULL");
$resolved_ticket_count = mysqli_num_rows($sql_resolved_tickets); $resolved_ticket_count = mysqli_num_rows($sql_resolved_tickets);
@@ -123,7 +126,7 @@ if (isset($_GET['project_id'])) {
// Get Completed Task Count // Get Completed Task Count
$sql_tasks_completed = mysqli_query($mysqli, $sql_tasks_completed = mysqli_query($mysqli,
"SELECT * FROM tickets, tasks "SELECT 1 FROM tickets, tasks
WHERE ticket_id = task_ticket_id WHERE ticket_id = task_ticket_id
AND ticket_project_id = $project_id AND ticket_project_id = $project_id
AND task_completed_at IS NOT NULL" AND task_completed_at IS NOT NULL"

View File

@@ -31,7 +31,9 @@ if (isset($_GET['status']) && $_GET['status'] == 1) {
$sql_projects = mysqli_query( $sql_projects = mysqli_query(
$mysqli, $mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM projects "SELECT SQL_CALC_FOUND_ROWS client_id, client_name, project_archived_at, project_completed_at, project_created_at,
project_description, project_due, project_id, project_name, project_number, project_prefix,
project_updated_at, user_id, user_name FROM projects
LEFT JOIN clients ON client_id = project_client_id LEFT JOIN clients ON client_id = project_client_id
LEFT JOIN users ON user_id = project_manager LEFT JOIN users ON user_id = project_manager
WHERE DATE(project_created_at) BETWEEN '$dtf' AND '$dtt' WHERE DATE(project_created_at) BETWEEN '$dtf' AND '$dtt'

View File

@@ -29,7 +29,13 @@ if (isset($_GET['status']) && $_GET['status'] == "inactive") {
$sql = mysqli_query( $sql = mysqli_query(
$mysqli, $mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM recurring_invoices "SELECT SQL_CALC_FOUND_ROWS category_id, category_name, client_currency_code, client_id, client_name,
recurring_invoice_amount, recurring_invoice_created_at, recurring_invoice_currency_code,
recurring_invoice_discount_amount, recurring_invoice_frequency, recurring_invoice_id,
recurring_invoice_last_sent, recurring_invoice_next_date, recurring_invoice_number,
recurring_invoice_prefix, recurring_invoice_scope, recurring_invoice_status,
recurring_payment_id, recurring_payment_recurring_invoice_id,
recurring_payment_saved_payment_id FROM recurring_invoices
LEFT JOIN clients ON recurring_invoice_client_id = client_id LEFT JOIN clients ON recurring_invoice_client_id = client_id
LEFT JOIN categories ON recurring_invoice_category_id = category_id LEFT JOIN categories ON recurring_invoice_category_id = category_id
LEFT JOIN recurring_payments ON recurring_payment_recurring_invoice_id = recurring_invoice_id LEFT JOIN recurring_payments ON recurring_payment_recurring_invoice_id = recurring_invoice_id

View File

@@ -17,9 +17,9 @@ $sql_all_years = mysqli_query($mysqli, "SELECT YEAR(expense_date) AS all_years F
ORDER BY all_years DESC" ORDER BY all_years DESC"
); );
$sql_categories_income = mysqli_query($mysqli, "SELECT * FROM categories WHERE category_type = 'Income' ORDER BY category_name ASC"); $sql_categories_income = mysqli_query($mysqli, "SELECT category_id, category_name FROM categories WHERE category_type = 'Income' ORDER BY category_name ASC");
$sql_categories_expense = mysqli_query($mysqli, "SELECT * FROM categories WHERE category_type = 'Expense' ORDER BY category_name ASC"); $sql_categories_expense = mysqli_query($mysqli, "SELECT category_id, category_name FROM categories WHERE category_type = 'Expense' ORDER BY category_name ASC");
?> ?>

View File

@@ -63,7 +63,9 @@ if (!$client_url) {
$sql = mysqli_query( $sql = mysqli_query(
$mysqli, $mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM software "SELECT SQL_CALC_FOUND_ROWS client_id, client_name, software_created_at, software_description, software_expire,
software_id, software_license_type, software_name, software_seats, software_type,
software_version, vendor_id, vendor_name FROM software
LEFT JOIN clients ON client_id = software_client_id LEFT JOIN clients ON client_id = software_client_id
LEFT JOIN vendors ON vendor_id = software_vendor_id LEFT JOIN vendors ON vendor_id = software_vendor_id
WHERE (software_name LIKE '%$q%' OR software_type LIKE '%$q%' OR software_key LIKE '%$q%' OR client_name LIKE '%$q%') WHERE (software_name LIKE '%$q%' OR software_type LIKE '%$q%' OR software_key LIKE '%$q%' OR client_name LIKE '%$q%')

View File

@@ -11,7 +11,10 @@ require_once "includes/inc_all.php";
enforceContactCan('accounting'); enforceContactCan('accounting');
$recurring_invoices_sql = mysqli_query($mysqli, "SELECT * FROM recurring_invoices $recurring_invoices_sql = mysqli_query($mysqli, "SELECT recurring_invoice_amount, recurring_invoice_frequency, recurring_invoice_id,
recurring_invoice_next_date, recurring_invoice_number, recurring_invoice_prefix,
recurring_invoice_scope, recurring_invoice_status, recurring_payment_id,
recurring_payment_recurring_invoice_id, recurring_payment_saved_payment_id FROM recurring_invoices
LEFT JOIN recurring_payments ON recurring_payment_recurring_invoice_id = recurring_invoice_id LEFT JOIN recurring_payments ON recurring_payment_recurring_invoice_id = recurring_invoice_id
WHERE recurring_invoice_client_id = $session_client_id WHERE recurring_invoice_client_id = $session_client_id
AND recurring_invoice_status = 1 AND recurring_invoice_status = 1

View File

@@ -59,12 +59,12 @@ if (isset($_GET['id']) && intval($_GET['id'])) {
); );
// Get Tasks // Get Tasks
$sql_tasks = mysqli_query( $mysqli, "SELECT * FROM tasks WHERE task_ticket_id = $ticket_id ORDER BY task_order ASC, task_id ASC"); $sql_tasks = mysqli_query( $mysqli, "SELECT 1 FROM tasks WHERE task_ticket_id = $ticket_id ORDER BY task_order ASC, task_id ASC");
$task_count = mysqli_num_rows($sql_tasks); $task_count = mysqli_num_rows($sql_tasks);
// Get Completed Task Count // Get Completed Task Count
$sql_tasks_completed = mysqli_query($mysqli, $sql_tasks_completed = mysqli_query($mysqli,
"SELECT * FROM tasks "SELECT 1 FROM tasks
WHERE task_ticket_id = $ticket_id WHERE task_ticket_id = $ticket_id
AND task_completed_at IS NOT NULL" AND task_completed_at IS NOT NULL"
); );

View File

@@ -13,7 +13,8 @@ require_once "includes/inc_all.php";
enforceContactCan('accounting'); enforceContactCan('accounting');
$invoices_sql = mysqli_query($mysqli, "SELECT * FROM invoices WHERE invoice_client_id = $session_client_id AND (invoice_status = 'Viewed' OR invoice_status = 'Sent' OR invoice_status = 'Partial') ORDER BY invoice_date DESC"); $invoices_sql = mysqli_query($mysqli, "SELECT invoice_amount, invoice_date, invoice_due, invoice_id, invoice_number, invoice_prefix,
invoice_scope, invoice_status, invoice_url_key FROM invoices WHERE invoice_client_id = $session_client_id AND (invoice_status = 'Viewed' OR invoice_status = 'Sent' OR invoice_status = 'Partial') ORDER BY invoice_date DESC");
// Payment Provider Active Query // Payment Provider Active Query

View File

@@ -349,7 +349,10 @@ if ($tickets_pending_assignment > 0) {
// Recurring tickets // Recurring tickets
// Get recurring tickets for today // Get recurring tickets for today
$sql_recurring_tickets = mysqli_query($mysqli, "SELECT * FROM recurring_tickets WHERE recurring_ticket_next_run = CURDATE()"); $sql_recurring_tickets = mysqli_query($mysqli, "SELECT recurring_ticket_asset_id, recurring_ticket_assigned_to, recurring_ticket_billable,
recurring_ticket_category, recurring_ticket_client_id, recurring_ticket_contact_id,
recurring_ticket_created_by, recurring_ticket_details, recurring_ticket_frequency,
recurring_ticket_id, recurring_ticket_priority, recurring_ticket_subject FROM recurring_tickets WHERE recurring_ticket_next_run = CURDATE()");
if (mysqli_num_rows($sql_recurring_tickets) > 0) { if (mysqli_num_rows($sql_recurring_tickets) > 0) {
while ($row = mysqli_fetch_assoc($sql_recurring_tickets)) { while ($row = mysqli_fetch_assoc($sql_recurring_tickets)) {
@@ -671,7 +674,13 @@ if ($config_send_invoice_reminders == 1) {
// Send Recurring Invoices that match todays date and are active // Send Recurring Invoices that match todays date and are active
//Loop through all recurring that match today's date and is active //Loop through all recurring that match today's date and is active
$sql_recurring_invoices = mysqli_query($mysqli, "SELECT * FROM recurring_invoices $sql_recurring_invoices = mysqli_query($mysqli, "SELECT client_name, client_net_terms, recurring_invoice_amount, recurring_invoice_category_id,
recurring_invoice_client_id, recurring_invoice_currency_code,
recurring_invoice_discount_amount, recurring_invoice_email_notify,
recurring_invoice_frequency, recurring_invoice_id, recurring_invoice_last_sent,
recurring_invoice_next_date, recurring_invoice_note, recurring_invoice_scope,
recurring_invoice_status, recurring_payment_account_id, recurring_payment_currency_code,
recurring_payment_method, recurring_payment_recurring_invoice_id FROM recurring_invoices
LEFT JOIN recurring_payments ON recurring_invoice_id = recurring_payment_recurring_invoice_id LEFT JOIN recurring_payments ON recurring_invoice_id = recurring_payment_recurring_invoice_id
LEFT JOIN clients ON client_id = recurring_invoice_client_id LEFT JOIN clients ON client_id = recurring_invoice_client_id
WHERE recurring_invoice_next_date = CURDATE() WHERE recurring_invoice_next_date = CURDATE()