For my website needs I made a custom procedural MySQL function in PHP which can INSERT, UPDATE, SELECT or DELETE data from database. I would like a review and any suggestions for improvement or addition of new features.
function mysqli_database_query($sql, $values, $param = NULL, $result_param = NULL) {
require "dbconn.script.php";
// String to array conversion
if (!is_array($values)) {
$values_array = array($values);
} else {
$values_array = $values;
}
// Number of values checker and string of parameter types creation
$number_of_values = count($values_array);
if ($number_of_values > 1) {
$param_types = implode("", array_map(function($val) { return gettype($val)[0]; }, $values_array));
} else {
$param_types = gettype($values_array[0])[0];
}
// SQL query execution
$stmt = mysqli_stmt_init($conn);
mysqli_stmt_prepare($stmt, $sql);
mysqli_stmt_bind_param($stmt, $param_types, ...$values_array);
mysqli_stmt_execute($stmt);
// SQL query results management
if (preg_match("/^SELECT.*/", $sql)) {
$results = mysqli_stmt_get_result($stmt);
# RETURN ASSOCIATIVE AND NUMERIC ARRAY COMBINED EVEN IF RESULT PARAMETER IS INVALID
if ($result_param === NULL || $result_param !== "assoc" || $result_param !== "num" || $result_param !== "row") {
return mysqli_fetch_array($results, MYSQLI_BOTH);
# RETURN ASSOCIATIVE ARRAY
} else if ($result_param === "assoc") {
return mysqli_fetch_array($results, MYSQLI_ASSOC);
# RETURN NUMERIC ARRAY
} else if ($result_param === "num") {
return mysqli_fetch_array($results, MYSQLI_NUM);
# RETURN ONE ROW
} else if ($result_param === "row") {
if ($param === NULL || $param !== "id") {
return mysqli_fetch_row($results);
}
# RETURN ONE ROW ID
if ($param === "id") {
$result = mysqli_fetch_row($results);
return $result["id"];
}
}
}
if (preg_match("/^INSERT.*/", $sql)) {
# RETURN LAST INSERTED ID
if ($param === "insert_id") {
return mysqli_insert_id($conn);
# RETURN NUMBER OF AFFECTED ROWS
} else if ($param === "affected_rows") {
return mysqli_affected_rows($conn);
} else {
return false;
}
}
if (preg_match("/^UPDATE.*/", $sql)) {
# RETURN NUMBER OF AFFECTED ROWS
if ($param === "affected_rows") {
return mysqli_affected_rows($conn);
} else {
return false;
}
}
if (preg_match("/^DELETE.*/", $sql)) {
# RETURN NUMBER OF AFFECTED ROWS
if ($param === "affected_rows") {
return mysqli_affected_rows($conn);
} else {
return false;
}
}
};