PHP-запрос Изменение результата от 1 до YES - PullRequest
0 голосов
/ 10 ноября 2011

У меня есть фрагмент кода, где я вызываю набор результатов с запросом, а затем отправляю результаты по электронной почте в виде CSV. Один столбец моих результатов возвращает либо 1, либо 0. Мне бы хотелось, чтобы при создании CSV записывалось YES для результатов с 1 и No для результатов, возвращаемых как 0. Это только для одного столбца, поэтому Я не мог использовать str_replace, так как это повлияло бы на все данные (я не очень хорош в PHP, поэтому могу ошибаться).

Я попробовал несколько вещей, но ни одна из них не работает, ниже приведен раздел кода, который я попробовал:

while ($row = mysqli_fetch_array($result)) { 

if ($row->Optin_Marketing == "1") {
$mark = 'YES';
}
else {
$mark = 'NO';
}

$row->Optin_Marketing = $mark;

      for ($i = 0; $i < $columns; $i++) { 
        $row = str_replace('"', '', $row);
        $row = str_replace('en ', '', $row);

        // clean up the data; strip slashes; replace double quotes with two single quotes 
        $data_rows .= $file["csv_contain"] . preg_replace('/'.$file["csv_contain"].'/', $file["csv_contain"].$file["csv_contain"], stripslashes($row[$i])) . $file["csv_contain"];
        $data_rows .= ($i < $columns-1) ? $file["csv_separate"] : '';
      } 
      $data_rows .= $this->csv_end_row; // add data row to CSV file 
    } 

Любая помощь по этому вопросу будет принята с благодарностью.

Спасибо

Мой запрос:

$emailCSV->setQuery('SELECT
orderheader.ordernumber As Order_Number
, ccilog.orderid AS Order_ID
, ccilog.userid AS User_ID
, orderheader.billingcustomeremailaddress AS Customer_Email
, orderheader.billingcontactfirstname AS First_Name
, orderheader.billingcontactlastname AS Last_Name
, orderheader.billingcustomername AS Company
, orderheader.billingcustomeraddress1 AS Address_1
, orderheader.billingcustomeraddress2 AS Address_2
, orderheader.billingcustomeraddress3 AS Address_3
, orderheader.billingcustomercity AS City
, orderheader.billingcustomercounty AS County
, orderheader.billingcustomerpostcode AS Postcode
, users.sendmarketinginfo AS Optin_Marketing
FROM orderheader 
LEFT JOIN users ON orderheader.userid=users.id
LEFT JOIN ccilog ON orderheader.id=ccilog.orderid
LEFT JOIN orderitems ON ccilog.orderid=orderitems.orderid
WHERE ccilog.formattedpaymentdate >= "'.$start.'" AND ccilog.formattedpaymentdate <= "'.$end.'"
');

Ответы [ 3 ]

3 голосов
/ 10 ноября 2011

Вы можете сделать это в своем запросе mysql:

SELECT u.fieldname, CASE WHEN u.OPTION IS 1 THEN 'Yes' ELSE 'No' END AS 'yes/no'
FROM tblName u;

Или вы можете сделать это, как предложил Никб.

РЕДАКТИРОВАТЬ:

Чтобы вставить его в свойзапрос, вы бы заменить это:

users.sendmarketinginfo AS 

На это:

CASE users.sendmarketinginfo WHEN 1 THEN 'Yes' ELSE 'No' END AS 'Optin_Marketing'
0 голосов
/ 10 ноября 2011

Ну, я не нашел функции mysqli_fetch_array в PHP, поэтому я просто предположил, что вы имели в виду mysql_fetch_array , что, судя по названию, должно быть примерно таким же.В вашем коде есть две проблемы, первая из которых связана с определением массива выборки:

mysql_fetch_array - извлечение строки результата в виде ассоциативного массива, числового массива илиоба

Можно исправить следующим образом:

while ($row = mysql_fetch_object($result)) { 
   $marketingOption = $row["Optin_Marketing"];

Если вы вызываете fetch_array, вы должны получить массив, а не объект, поэтому действуйте соответствующим образом.Вы можете просто позвонить mysql_fetch_object и сделать это следующим образом:

while ($row = mysql_fetch_object($result)) { 

Второй момент хорошо обозначен nickb, поэтому я просто пропущу его.Надеюсь, я смогу помочь!

0 голосов
/ 10 ноября 2011

Сравните целочисленное значение, например, так:

while( $row = mysqli_fetch_array( $result)) 
{
    $row['Optin_Marketing'] = ( intval( $row['Optin_Marketing']) == 1) ? "YES" : "NO";
    echo $row['Optin_Marketing']; // Must be YES or NO here
}

Выше приведено сжатие всей проверки и переход в одну строку с использованием троичного оператора .Вы обращались к массиву, как к объекту (используя -> вместо ['']).

Кроме того, как это может работать, поскольку $row является массивом, а str_replace ожидаетстрока?Не уверен, что вы пытаетесь сделать, но вам может понадобиться что-то вроде array_map .

$row = str_replace('"', '', $row);
$row = str_replace('en ', '', $row);
...