SQLSTATE [42000]:语法错误或访问冲突:1064?

时间:2015-07-22 12:46:57

标签: php mysql database magento import

代码有什么问题?我无法上传到数据库。消息来了:

  

SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在“ACQUA')附近使用正确的语法”'在第2行

查询是:

SELECT `vals`.*, `opt`.* 
  FROM `eav_attribute_option_value` AS `vals` 
 INNER JOIN `eav_attribute_option` AS `opt` ON opt.option_id = vals.option_id 
 WHERE (opt.attribute_id='191') 
   AND (vals.value in ('ALESSANDRO DELL'ACQUA'))

PHP代码:

<?php

/**
 * Adapted by Christopher Shennan 
 * http://www.chrisshennan.com
 * 
 * Date: 20/04/2011
 * 
 * Adaptered from original post by Srinigenie
 * Original Post - http://www.magentocommerce.com/boards/viewthread/9391/
 */

class Mage_Eav_Model_Import extends Mage_Eav_Model_Mysql4_Entity_Attribute {

  private $fileName;
  private $delimiter = '|';
  private $enclosure = '"';



  private function &getCsv() {
    $file = fopen($this->fileName, "r");
    while (!feof($file)) {
      $csvArr[] = fgetcsv($file, 0, $this->delimiter, $this->enclosure);
    }

    fclose($file);
    return $csvArr;
  }

  protected function populateOptionTable($attribId) {
    echo "Upload Begin<br/>";

    $fields = array();
    $values = array(); // store id => values
    $optionValues = array(); // option id => $values
    $option = array('value' => $optionValues);
    $updateOptionValId;
    $values = null;
    $row = null;
    $disCounter = 0;

    $optionTable = $this->getTable('attribute_option');
    $optionValueTable = $this->getTable('attribute_option_value');
    $write = $this->_getWriteAdapter();
    $csvStoreArr = array();

    // Get CSV into Array
    $csv = & $this->getCsv();

    $read = $this->_getReadAdapter();

    // exit if the csv file is empty or if it contains only the headers
    if (count($csv) < 1 or count($csv) == 1)
      return;

    $fields = $csv[0]; // get the field headers from first row of CSV
    // get the store Ids
    $stores = Mage::getModel('core/store')
            ->getResourceCollection()
            ->setLoadDefault(true)
            ->load();

    // determine the stores for which option values are being uploaded for
    foreach ($fields as $hdr) {
      if ($hdr === 'position' || $hdr === 'isDefault' || $hdr === 'ERROR') {
        continue;
      }
      foreach ($stores as $store) {
        if ($store->getCode() === $hdr)
          $csvStoreArr[$hdr] = $store->getId();
      }
    }

    // start reading the option values - from row 1 (note that 0 represents headers)
    for ($indx = 1; $indx < count($csv); $indx++) {
      $values = null; // initialize to null
      $row = $csv[$indx]; // get row

      if (isset($row) && count($row) > 0) {

        //escape the single quote
        //$whereParam = $read->quote($row);


        if (is_array($row))
          $whereParam = '(\'' . implode($row, '\',\'') . '\')';
        else if (strlen($row))
          $whereParam = '(\'' . $row . '\')';

        $select = $read->select()->from(array('vals' => $optionValueTable))
                ->join(array('opt' => $optionTable), 'opt.option_id=vals.option_id')
                ->where('opt.attribute_id=?', $attribId);
        $select = $select
                ->where('vals.value in ' . $whereParam);

        $optionValData = $read->fetchAll($select);

        unset($select);

        // get the option Id for this option
        if (count($optionValData) > 0) {
          $optionValDataRow = $optionValData[0];
          $optionId = $optionValDataRow['option_id'];
        } else
          $optionId = null;

        $intOptionId = (int) $optionId;

        if (!$intOptionId) {
          $data = array(
              'attribute_id' => $attribId,
              'sort_order' => isset($option['order'][$optionId]) ? $option['order'][$optionId] : 0,
          );
          try {
            $write->insert($optionTable, $data);
            $intOptionId = $write->lastInsertId();
          } catch (Exception $e) {
            Mage::log($e->getMessage());
          }
        } else {
          $data = array(
              'sort_order' => isset($option['order'][$optionId]) ? $option['order'][$optionId] : 0,
          );
          $write->update($optionTable, $data, $write->quoteInto('option_id=?', $intOptionId));
        }

        $colIndx = 0; //initialize row's column index
        if (isset($row) && is_array($row) && count($row) > 0) {
          foreach ($row as $optVal) {
            if ($fields[$colIndx] !== 'position' || $fields[$colIndx] !== 'isDefault' || $fields[$colIndx] !== 'ERROR') {
              $values[$csvStoreArr[$fields[$colIndx]]] = $optVal; // store id => option value
            }
            $colIndx++;
          }
        }
      }


      if (isset($values) && is_array($values) && count($values) > 0) {
        foreach ($values as $storeId => $value) {
          if (!empty($value) || strlen($value) > 0) {
            $value = trim($value);
            $data = array(
                'option_id' => $intOptionId,
                'store_id' => $storeId,
                'value' => $value,
            );
            $optionValInsert = true;
            $optionValUpdate = false;

            foreach ($optionValData as $valData) {
              if ((int) $valData['option_id'] === $intOptionId &&
                      (int) $valData['store_id'] === $storeId) {
                $optionValInsert = false;
                if (strcasecmp(trim($valData['value']), $value) !== 0) {
                  $optionValUpdate = true;
                  $updateOptionValId = $valData['value_id'];
                }
                break;
              }
            }

            if ($optionValInsert) {
              $write->insert($optionValueTable, $data);
              Mage::log('Inserted Value -' . $value);
            } else if ($optionValUpdate) {
              $write->update($optionValueTable, $data, $write->quoteInto('option_id=?', $updateOptionValId));
              Mage::log('Updated Value -' . $value);
            }
          }
        }
      }
      $optionValues[$optionId] = $values;

      if ($indx % 20 == 0) {
        echo "" . $indx . ' - uploaded!!<br />';
        Mage::log($indx . ' - attributes uploaded!!', null, $this->fileName . '.log');
      }
    }
    echo "" . $indx . ' - uploaded!!<br />';
    echo '<b> Attribute Upload Finished </b><br />';
    $option['value'] = $optionValues;
    return null;
  }

  /**
   * Enter description here...
   *
   * @param Mage_Core_Model_Abstract $object
   * @return Mage_Eav_Model_Mysql4_Entity_Attribute
   */
  public function saveOptionValues($attributeId, $fn) {
    $option = array();

    $this->fileName = $fn;

    echo '<strong>Importing Attributes</strong><br/><br/>Reading file contents - ' . $this->fileName . '<br />';

    Mage::log("Upload Begin", null, $this->fileName . '.log');
    // Step 1 -- Get attribute Id from attribute code
    $atrribId = $attributeId; //569
    // Step 2 Obtain the option values into an array
    $option = $this->populateOptionTable($atrribId);
  }

}

2 个答案:

答案 0 :(得分:0)

错误是由于字符串中的单个引号:'ALESSANDRO DELL'ACQUA。

  

SELECT vals。,opt。来自eav_attribute_option_value AS vals INNER JOIN   eav_attribute_option AS opt ON opt.option_id = vals.option_id WHERE   (opt.attribute_id ='191')AND(vals.value in('ALESSANDRO   Dell'Acqua的'))

尝试使用双引号。

答案 1 :(得分:0)

MySQL中的字符串文字

[https://dev.mysql.com/doc/refman/5.0/en/string-literals.html]

'单引号是MySQL中的保留字符,有几种方法可以在字符串中包含引号字符:

  • 引用"'"的字符串中的"'"可以写为""''"

  • 引用"""的字符串中的"""可以写为""""

  • 使用转义字符(""\")作为引号字符前面。

  • 引用"'"的字符串中的"""无需特殊处理 不需要加倍或逃脱。以同样的方式,在字符串中""" 引用"'"不需要特殊处理。

要避免在PreparedStatement http://www.w3schools.com/php/php_mysql_prepared_statements.asp

中使用PHP

在您的查询中,应该是'ALESSANDRO DELL''ACQUA'而不是'ALESSANDRO DELL'ACQUA'