mysqli::real_escape_string(): Argument #1 ($string) must be of type string

Viewed 8

I have been searching online for hours trying to find the bug in my code that is throwing this error. The goal of the script is to create/edit the five price levels for every product in our database, based on the formulas that are shown in the code below.

PHP Fatal error:  Uncaught TypeError: mysqli::real_escape_string(): Argument #1 ($string) must be of type string, mysqli_result given in /var/www/html/pricecheck.php:96
Stack trace:
#0 [internal function]: mysqli->real_escape_string()
#1 /var/www/html/pricecheck.php(96): array_map()
#2 {main}
  thrown in /var/www/html/pricecheck.php on line 96

My PHP code is as follows:

<?php
set_time_limit(0);
error_reporting(E_ALL ^ E_DEPRECATED ^ E_NOTICE);

include 'conn_dev.php';

$products = array();
$query = "select rowid, price, price_min, cost_price FROM $table_products WHERE price > 0 AND cost_price > 0";
$result = mysqli_query($conn, $query) or trigger_error("Product Query Failed! SQL: $query - Error: ".mysqli_error($conn), E_USER_ERROR);
$howmany = mysqli_num_rows($result);

if ($howmany > 0) {
    while ($row = mysqli_fetch_array($result)) {
        $rowid = $row['rowid'];
        $price = $row['price'];
        $price_min = $row['price_min'];
        $cost_price = $row['cost_price'];
        $products[$rowid] = array(
            'price' => $price,
            'price_min' => $price_min,
            'cost_price' => $cost_price
        );

      $query_latest = "SELECT MAX(date_price) FROM $table_product_prices WHERE `fk_product` = $rowid AND `price_level` = 1";
      $date_price = mysqli_query($conn, $query_latest) or trigger_error("L1 Date Query failed! SQL: $query - Error: ".mysqli_error($conn), E_USER_ERROR);
      $product_id = $rowid;

      for ($i = 1; $i < 6; $i++) {
          if ($i == 1) {
              $level_price = $price;
              $level_price_min = $cost_price;
          } else if ($i == 2) {
              $level_price = round($cost_price * 1.1,2);
              $level_price_min = round($cost_price * 1.1,2);
          } else if ($i == 3) {
              $level_price = $price;
              $level_price_min = round($cost_price * 1.1,2);
          } else if ($i == 4) {
              $level_price = round($price * 0.9,2);
              $level_price_min = $cost_price * 1.1;
              if ($level_price < $level_price_min) $level_price = $level_price_min;
          } else if ($i == 5) {
              $level_price = round((($price - $cost_price) * 0.5) + $cost_price,2);
              $level_price_min = round($cost_price * 1.1,2);
            if ($level_price < $level_price_min) $level_price = $level_price_min;
          }
          
          $price_ttc = round($level_price * 1.055,2);
          $price_ttc_min = round($level_price_min * 1.055,2);

          $sql_data_array = array();
          $sql_data_array['entity'] = 1;
          $sql_data_array['tms'] = $date_price;
          $sql_data_array['fk_product'] = $product_id;
          $sql_data_array['date_price'] = $date_price;
          $sql_data_array['price_level'] = $i;
          $sql_data_array['price'] = number_format($level_price, 8, '.', '');
          $sql_data_array['price_ttc'] = number_format($price_ttc, 8, '.', '');
          $sql_data_array['price_min'] = number_format($level_price_min, 8, '.', '');
          $sql_data_array['price_min_ttc'] = number_format($price_ttc_min, 8, '.', '');
          $sql_data_array['price_base_type'] = 'HT';
          $sql_data_array['default_vat_code'] = '';
          $sql_data_array['tva_tx'] = 5.5;
          $sql_data_array['recuperableonly'] = 0;
          $sql_data_array['localtax1_tx'] = 0;
          $sql_data_array['localtax1_type'] = 0;
          $sql_data_array['localtax2_tx'] = 0;
          $sql_data_array['localtax2_type'] = 0;
          $sql_data_array['fk_user_author'] = 2;
          $sql_data_array['tosell'] = 1;
          $sql_data_array['price_by_qty'] = 0;
          $sql_data_array['import_key'] = 'testing';
          $sql_data_array['multicurrency_code'] = '';
          $sql_data_array['multicurrency_tx'] = 1;

      $product_price_level_data = isset($product_prices[$i][$product_id]) ? $product_prices[$i][$product_id] : array();

      if (isset($product_price_level_data['rowid'])) {

        $rowid_level = $product_price_level_data['rowid'];
        $sets = array();

          foreach ($sql_data_array as $key => $value) {
              $sets[]='`'.$key.'`=\''.addslashes($value).'\'';
          }

          $sqlquery='SET '.implode(', ',$sets);
          $sql_i = "UPDATE $table_product_prices $sqlquery WHERE rowid='$rowid_level'";
          $result_i = mysqli_query($conn, $sql_i) or trigger_error("Query Failed! SQL: $sql_i - Error: ".mysqli_error($conn), E_USER_ERROR);

      } else {

          $sql_i = sprintf('INSERT INTO %s (%s) VALUES ("%s") ', $table_product_prices, implode(', ', array_map(array($conn, 'real_escape_string'), array_keys($sql_data_array))), implode('", "',array_map(array($conn, 'real_escape_string'), $sql_data_array)));
          $result_i = mysqli_query($conn, $sql_i) or trigger_error("Query Failed! SQL: $sql_i - Error: ".mysqli_error($conn), E_USER_ERROR);

          }
      }
    }
}

I know that this is a very "specific" question, but I suspect that I am not the only one struggling with "real_escape_string()"s. Any advice on fixing this?

0 Answers
Related