Here's a way I am doing it after researching it for a while. I wanted to make a Laravel API endpoint that checks if a field is "in use", so the important information is: 1] which DB table? 2] what DB column? and 3] is there a value in that column that matches the search terms?
Knowing this, we can construct our associative array:
$SEARCHABLE_TABLE_COLUMNS = [
'users' => [ 'email' ],
];
Then, we can set our values that we will check:
$table = 'users';
$column = 'email';
$value = '';
Then, we can use array_key_exists[]
and in_array[]
with eachother to execute
a one, two step combo and then act upon the truthy
condition:
// step 1: check if 'users' exists as a key in `$SEARCHABLE_TABLE_COLUMNS`
if [array_key_exists[$table, $SEARCHABLE_TABLE_COLUMNS]] {
// step 2: check if 'email' is in the array: $SEARCHABLE_TABLE_COLUMNS[$table]
if [in_array[$column, $SEARCHABLE_TABLE_COLUMNS[$table]]] {
// if table and column are allowed, return Boolean if value already exists
// this will either return the first matching record or null
$exists = DB::table[$table]->where[$column, '=', $value]->first[];
if [$exists] return response[]->json[[ 'in_use' => true ], 200];
return response[]->json[[ 'in_use' => false ], 200];
}
// if $column isn't in $SEARCHABLE_TABLE_COLUMNS[$table],
// then we need to tell the user we can't proceed with their request
return response[]->json[[ 'error' => 'Illegal column name: '.$column ], 400];
}
// if $table isn't a key in $SEARCHABLE_TABLE_COLUMNS,
// then we need to tell the user we can't proceed with their request
return response[]->json[[ 'error' => 'Illegal table name: '.$table ], 400];
I apologize for the Laravel-specific PHP code, but I will leave it because I think you can read it as pseudo-code. The important part is the two if
statements that are executed synchronously.
array_key_exists[]
andin_array[]
are PHP functions.
source:
//php.net/manual/en/function.array-key-exists.php
//php.net/manual/en/function.in-array.php
The nice thing about the algorithm that I showed above is that you can make a REST endpoint such as GET /in-use/{table}/{column}/{value}
[where table
, column
, and value
are
variables].
You could have:
$SEARCHABLE_TABLE_COLUMNS = [
'accounts' => [ 'account_name', 'phone', 'business_email' ],
'users' => [ 'email' ],
];
and then you could make GET requests such as:
GET /in-use/accounts/account_name/Bob's Drywall
[you may need to uri encode the last part, but usually not]
GET /in-use/accounts/phone/888-555-1337
GET /in-use/users/email/
Notice also that no one can do:
GET /in-use/users/password/dogmeat1337
because password
is not listed in your list of allowed columns for user
.
Good luck on your journey.
[PHP 4, PHP 5, PHP 7, PHP 8]
in_array — Checks if a value exists in an array
Description
in_array[mixed $needle
, array $haystack
,
bool $strict
= false
]: bool
Parameters
needle
The searched value.
Note:
If
needle
is a string, the comparison is done in a case-sensitive manner.
haystack
The array.
strict
If the third parameter strict
is set to
true
then the in_array[] function will also check the types of the needle
in the haystack
.
Note:
Prior to PHP 8.0.0, a
string
needle
will match an array value of0
in non-strict mode, and vice versa. That may lead to undesireable results. Similar edge cases exist for other types, as well. If not absolutely certain of the types of values involved, always use thestrict
flag to avoid unexpected behavior.
Return Values
Returns true
if needle
is found in the array, false
otherwise.
Examples
Example #1 in_array[] example
The second condition fails because in_array[] is case-sensitive, so the program above will display:
Example #2 in_array[] with strict example