Я провел все воскресенье, пытаясь понять это, но я не уверен, как правильно это сформулировать. Он проверяет каждый час через работу Cron для новых продаж. Затем берет номер продукта и номер чека. Он использует номер продукта, чтобы проверить информационную базу данных и собрать всю эту информацию из каждой строки для недавно проданных продуктов. Затем для каждого проданного продукта мне нужно добавить номер квитанции в конце массива и вставить всю эту информацию в третью базу данных, которая сохраняет все продажи.
Моя главная проблема — я объединяю их, и они не будут вставлены в базу данных. У меня это сработало в первый раз, но я схватил только первый ряд.
<?php
//find out current time and 1 hour ago
$current_time = strtotime("now");
$tenmin_ago = strtotime('-10 min');
$hour_ago = strtotime('-1 hour');
//////////////////////////////////////////////////////////////////
/////////////////// Connect to Sales Database ///////////////////
//////////////////////////////////////////////////////////////////
// connect to EMAP sales MySQL server
$server='localhost';
$user='user';
$password='pass';
$database='sales_data';
$con = mysqli_connect($server,$user,$password,$database);
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: SALES " . mysqli_connect_error();
}
//////////////////////////////////////////////////////////////////
///////////////////// Connect to EM Database ////////////////////
//////////////////////////////////////////////////////////////////
//EM connect to DLGuard-EM MySQL server
$em_server='localhost';
$em_user='user';
$em_password='pass';
$em_database='databaseEM';
$em_con = mysqli_connect($em_server,$em_user,$em_password,$em_database);
//EM Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: EM " . mysqli_connect_error();
}
//EM grab store name
$em_dlg_store = "EM";
$em_rows = array();
$em_request = "SELECT * FROM customers WHERE date BETWEEN $hour_ago AND {$current_time}";
$em_result = mysqli_query($em_con, $em_request) or die("ERROR NO SALES EM");
while ($em_row = mysqli_fetch_array($em_result)) {
$em_prod_num = $em_row["prod_num"];
$em_rows[] = $em_row["receipt"];
}
//////////////////////////////////////////////////////////////////
///////////////////// Grab info for EM Sales ////////////////////
//////////////////////////////////////////////////////////////////
$emap_rows = array();
$emap_request = "SELECT * FROM all_products WHERE dlgprod_num='{$em_prod_num}' AND dlg_store='{$em_dlg_store}'";
$emap_result = mysqli_query($con, $emap_request) or die("ERROR dlg prod num EM");
while ($emap_row = mysqli_fetch_array($emap_result)) $emap_rows[] = $emap_row;
$em_emap_rows = array_merge($em_rows, $emap_rows);
/*VALUES ('$emap_sku', '$emap_dlgprod_num', '$emap_book_title', '$emap_dlgprod_price', '$emap_author_name', '$emap_author_email', '$emap_publisher', '$emap_dlg_store', '$em_receipt');";*/
// 1
$em_add_sql = "INSERT INTO all_author_sales (sku, dlgprod_num, dlgprod_nam, dlgprod_price, author_name, author_email, publisher, dlg_store, dlgcustomer_receipt)
VALUES ('$em_emap_rows');";
if ($con->multi_query($em_add_sql) === TRUE) {
} else {
echo "Error: " . $em_add_sql . "<br>" . $con->error;
}
?>
xxxxxxxxxxxxxxxxxxxxxxxxx Обновление 2/27/17 xxxxxxxxxxxxxxxxxxxxxx
Вот обновленная версия, и она получает информацию, но теряет массив для получения где-то в разделе слияния или строки. Кроме того, это помещает заказ неправильно. вместо UPC, номера продукта, названия, цены и т. д., затем начинайте следующую строку для второй продажи, они смешивают их вместе, например, upc, UPC, номер продукта, номер продукта, название, название, цена, цена при двух продажах.
Вот новая ошибка. Я так близко, чтобы понять это, спасибо. Я собираюсь сделать 4 сценария и поочередно проверять продажи во всех 4 магазинах каждый час.
Warning: array_map(): Argument #2 should be an array in /home1/lotscav1/public_html/Sales/scripts/sales-notif.php on line 53
Warning: implode(): Invalid arguments passed in /home1/lotscav1/public_html/Sales/scripts/sales-notif.php on line 53
Error: INSERT INTO all_author_sales (sku, dlgprod_num, dlgprod_nam, dlgprod_price, author_name, author_email, publisher, dlg_store, dlgcustomer_receipt) VALUES ('('EM2200002','EM2200002','1','1','Island Girl','Island Girl','4.95','4.95','Marshall Gibson','Marshall Gibson','[email protected]','[email protected]','Dan Cuneo','Dan Cuneo','EM','EM'),(),');
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'EM2200002','EM2200002','1','1','Island Girl','Island Girl','4.95','4.95','Marsha' at line 2
Array
Вот обновленный код
<?php
//find out current time and 1 hour ago
$current_time = strtotime("now");
$hour_ago = strtotime('-24 hour');
//////////////////////////////////////////////////////////////////
/////////////////// Connect to Sales Database ///////////////////
//////////////////////////////////////////////////////////////////
// connect to EMAP sales MySQL server
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
//////////////////////////////////////////////////////////////////
///////////////////// Connect to EM Database ////////////////////
//////////////////////////////////////////////////////////////////
$mysqli_em = new mysqli("localhost", "username", "password", "database");
if ($mysqli_em->connect_errno) {
echo "Failed to connect to MySQL_EM: (" . $mysqli_em->connect_errno . ") " . $mysqli_em->connect_error;
}
//EM grab store name
$em_dlg_store = "EM";$em_rows = array();
$em_request = "SELECT * FROM customers WHERE date BETWEEN '$hour_ago' AND '$current_time'";
$em_result = mysqli_query($mysqli_em, $em_request) or die("Error No Sales EM");
while ($em_row = mysqli_fetch_array($em_result)) {
$em_prod_num = $em_row["prod_num"];
$em_rows[] = $em_row["receipt"];
}
//////////////////////////////////////////////////////////////////
///////////////////// Grab info for EM Sales ////////////////////
//////////////////////////////////////////////////////////////////
$emap_rows = array();
$emap_request = "SELECT * FROM all_products WHERE dlgprod_num='$em_prod_num' AND dlg_store='$em_dlg_store'";
$emap_result = mysqli_query($mysqli, $emap_request) or die("Error dlg prod num EM");
while ($emap_row = mysqli_fetch_array($emap_result)) $emap_rows[] = $emap_row;
$em_emap_rows = array_merge($emap_rows, $em_rows);
/*VALUES ('$emap_sku', '$emap_dlgprod_num', '$emap_book_title', '$emap_dlgprod_price', '$emap_author_name', '$emap_author_email', '$emap_publisher', '$emap_dlg_store', '$em_receipt');";*/
// 1
$string = "";
foreach ($em_emap_rows as $key => $innerArr) {
$result = implode( array_map('quoteItems', $innerArr), ",");
$string .= "(" . $result . ")";
if( $key != count($array) - 1 ){
$string .= ",";
}
}
function quoteItems($item){
return "'" . $item . "'";
}
//$em_rowss = implode(",", $em_rows); this turns the receipt array into a string
$em_add_sql = "INSERT INTO all_author_sales (sku, dlgprod_num, dlgprod_nam, dlgprod_price, author_name, author_email, publisher, dlg_store, dlgcustomer_receipt)
VALUES ('$string');";
if ($mysqli->multi_query($em_add_sql) === TRUE) {
} else {
echo "Error: " . $em_add_sql . "<br>" . $mysqli->error . "<br>" . $em_rows;
}
?>
Я предполагаю, что верхняя часть кода работает. Но здесь есть несколько вещей, которые нужно проверить:
//////////////////////////////////////////////////////////////////
///////////////////// Grab info for EM Sales ////////////////////
//////////////////////////////////////////////////////////////////
$emap_rows = array();
$emap_request = "SELECT * FROM all_products WHERE dlgprod_num='{$em_prod_num}' AND dlg_store='{$em_dlg_store}'";
$emap_result = mysqli_query($con, $emap_request) or die("ERROR dlg prod num EM");
while ($emap_row = mysqli_fetch_array($emap_result)) $emap_rows[] = $emap_row;
По сути, вы помещаете все строки, полученные от запроса, в $emap_rows
массив, так что это больше похоже на:
$emap_rows = array(
0 => array(
'sku' => 'value',
'dlgprod_num' => 'value',
'dlgprod_nam' => 'value',
...
),
1 => array(
'sku' => 'value2',
'dlgprod_num' => 'value2',
'dlgprod_nam' => 'value2',
...
),
)
Вы ожидаете только 1 результат из предыдущего запроса?
Я предполагаю, что вы ожидаете только 1 строку для получения, иначе это не будет иметь смысла для меня. Я предполагаю, что вы хотите добавить $em_rows
стоимость (квитанция) каждому $emap_rows
// $em_emap_rows = array_merge($em_rows, $emap_rows);
Может быть, вы можете попробовать:
foreach( $emap_rows as $emap_row ) {
$v = array_values( $emap_row );
$v[] = $em_rows[0]; // because I expect only 1 result, added to array
$em_add_sql = "INSERT INTO all_author_sales ";
$em_add_sql .= " (sku, dlgprod_num, dlgprod_nam, dlgprod_price, author_name, author_email, publisher, dlg_store, dlgcustomer_receipt) ";
$em_add_sql .= " VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )";
$em_con->prepare( $em_add_sql );
$em_con->bind_param( 'sssssssss', $v[0], $v[1], $v[2], $v[3], $v[4], $v[5], $v[6], $v[7], $v[8] );
$em_con->execute();
}
В общем, я рекомендую создать весь скрипт с нуля, сделать его менее уязвимым для инъекций и т. Д. И более точным с точки зрения используемых данных. Не полагайтесь на получение только 1 результата, если вы не указали его в своем запросе (например, с помощью LIMIT).
Не полагайтесь на порядок данных, но на его ключ. Я использовал в приведенном выше примере
$v[0]
но было бы гораздо лучше использовать $emap_row['sku']
,
Примечание: код не проверен, это просто моя попытка понять сценарий и помочь.
Похоже, все это можно сделать одним запросом:
INSERT INTO all_author_sales (sku, dlgprod_num, dlgprod_nam,
dlgprod_price, author_name, author_email, publisher, dlg_store, dlgcustomer_receipt)
SELECT ap.sku, ap.dlgprod_num, ap.dlgprod_nam, ap.dlgprod_price,
ap.author_name, ap.author_email, ap.publisher, ap.dlg_store, c.receipt
FROM customers c
INNER JOIN all_products ap
ON c.prod_num = ap.dlgprod_num
AND c.date BETWEEN '{$hour_ago}' AND '{$current_time}'
AND dlg_store='{$em_dlg_store}'
Несколько указателей на заметку:
Из рассматриваемого запроса видно, что receipt
столбец в customers
стол, который входит в all_author_sales
как dlgcustomer_receipt
, Однако для всех ap.*
столбцы в SELECT
часть запроса выше, пожалуйста, используйте соответствующие имена столбцов из all_products
Таблица применима, если они не совпадают с написанными в запросе.
Поскольку вы используете MySQLi, рассмотрите возможность изменения кода для включения Подготовленные Запросы ради простоты и безопасности.
Вы просто вставляете массив в виде строки VALUES('$em_emap_rows')
, Это ошибка.
Выполнить цикл для массива и заключить в кавычки каждый элемент в каждом массиве, а затем внедрить массивы в основной массив.
$string = "";
foreach ($em_emap_rows as $key => $innerArr) {
$result = implode( array_map('quoteItems', $innerArr), ",");
$string .= "(" . $result . ")";
if( $key != count($array) - 1 ){
$string .= ",";
}
}
function quoteItems($item){
return "'" . $item . "'";
}
затем использование Values($string)
Спасибо за всю помощь. Я не мог заставить работать то, что вы дали мне для моей уникальной ситуации. Тем не менее, это вдохновило меня на мое рабочее решение вместе с небольшой помощью от старого друга. Вот код, который сейчас работает.
<?php
//find out current time and 1 hour ago
date_default_timezone_set('America/New_York');
$current_time = strtotime("now");
$hour_ago = strtotime('-1 hour');
//////////////////////////////////////////////////////////////////
/////////////////// Connect to Sales Database ///////////////////
//////////////////////////////////////////////////////////////////
$mysqli_s = new mysqli("localhost", "user", "password",
"server_sales_data");
if ($mysqli_s->connect_errno) {
echo "Failed to connect to MySQL: (" . $mysqli_s->connect_errno . ")
" . $mysqli_s->connect_error;
}
//////////////////////////////////////////////////////////////////
///////////////////// Connect to EM Database ////////////////////
//////////////////////////////////////////////////////////////////
$mysqli_em = new mysqli("localhost", "user", "password",
"server_dlgEM");
if ($mysqli_em->connect_errno) {
echo "Failed to connect to MySQL_EM: (" . $mysqli_em->connect_errno .
") " . $mysqli_em->connect_error;
}
//Grab store name
$dlg_store = "EM";
$em_request = "SELECT * FROM customers WHERE date BETWEEN '$hour_ago'
AND '$current_time'";
$em_result = mysqli_query($mysqli_em, $em_request) or die("Error No
Sales EM");
while ($em_row = mysqli_fetch_array($em_result)) {
$em_prod_num = $em_row["prod_num"];
$em_receipt = $em_row["receipt"];//////////////////////////////////////////////////////////////////
///////////////////// Grab info for EM Sales ////////////////////
//////////////////////////////////////////////////////////////////
$request_s = "SELECT * FROM all_products WHERE
dlgprod_num='$em_prod_num' AND dlg_store='$dlg_store'";
$result_s = mysqli_query($mysqli_s, $request_s) or die("Error dlg
prod num EM");
while ($row_s = mysqli_fetch_array($result_s)) {
$sku_s = $row_s["sku"];
$dlgprod_num_s = $row_s["dlgprod_num"];
$book_title_s = addslashes($row_s["book_title"]);
$dlgprod_price_s = $row_s["dlgprod_price"];
$author_name_s = addslashes($row_s["author_name"]);
$author_email_s = $row_s["author_email"];
$publisher_s = $row_s["publisher"];
$dlg_store_s = $row_s["dlg_store"];
$add_sql_s = "INSERT INTO all_author_sales SET
`sku`='$sku_s',
`dlgprod_num`='$dlgprod_num_s',
`dlgprod_nam`='$book_title_s',
`dlgprod_price`='$dlgprod_price_s',
`author_name`='$author_name_s',
`author_email`='$author_email_s',
`publisher`='$publisher_s',
`dlg_store`='$dlg_store_s',
`dlgcustomer_receipt`='$em_receipt' ";
//create signature
$sig = "The Admin Team at www.website.com";
//to
$admin_email = "[email protected]";
$to = array($author_email_s, $admin_email);
//setup email headers
$headers='From: ' . $admin_email . "\r\n" .
'Reply-To: ' . $admin_email . "\r\n" .
'X-Mailer: PHP/' . phpversion();
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$headers .= $emailbody."\n\n";
//email subject and body
$subject = "Your book stats";
$message = "Hi $author_name_s,<br />
I just wanted to send you a message and let you know that the book or
books below have just been purchased.<br /><br />
Store: $dlg_store_s<br />
Receipt: $em_receipt<br />
Sku Number: $sku_s<br /><br />
Book Title: $book_title_s<br />
Publisher: $publisher_s<br />
Product Number: $dlgprod_num_s<br />
Price: $dlgprod_price_s<br /><br />
Sincerely,<br />
$sig<br /><br />
To remove yourself from this notification, please send an email to
$admin_email with Unsubscribe in the subject line.
";
if ($mysqli_s->multi_query($add_sql_s) === TRUE) {
mail (implode(',', $to), $subject, $message, $headers);
} else {
echo "Error: " . $add_sql_s . "<br>" . $mysqli_s-
>error . "<br>" . $string;
}}}?>