Не удается подключиться к локальному серверу MySQL через сокет '/var/run/mysqld/mysqld.sock' (2)


Я использую Google API для создания локатора магазина в своем модуле. Я сохранил все адресованные хранилища в отдельной таблице и получил доступ к этой таблице с помощью прямого SQL-запроса, чтобы сопоставить местоположения, введенные пользователем из интерфейса. Вот мой запрос:

$resource = Mage::getSingleton('core/resource');      
$readConnection = $resource->getConnection('core_read');         
$query = sprintf("SELECT address, name, lat, lng, ( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM ".$resource->getTableName('onibi_storelocator/store')." HAVING distance < '%s' ORDER BY distance LIMIT 0 , 20",
      mysql_real_escape_string($center_lat),
      mysql_real_escape_string($center_lng),
      mysql_real_escape_string($center_lat),
      mysql_real_escape_string($radius));       

$results = $readConnection->fetchAll($query);

Этот код хорошо работает на моем локальном хосте, но при запуске его на сервере разработки он выдает ошибку, подобную этой:

Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Author: Fabian Schmengler, 2013-07-17

2 answers

mysql_real_escape_string требуется подключение к базе данных, открытое с помощью mysql_connect, чтобы получить текущую кодировку MySQL и правильно избежать ввода на основе этой кодировки.

Magento использует PDO, поэтому вы не можете использовать mysql_real_escape_string.

Посмотрите, как Magento работает с базой данных, в качестве подсказки:

$readConnection->fetchAll('SELECT foo FROM bar WHERE a = ?', array($some_var));

PDO избегает всего правильного и помогает вам избежать проблем с безопасностью.

Пожалуйста, также ознакомьтесь с руководством по PHP: http://www.php.net/manual/de/pdostatement .fetchall.php

 5
Author: thebod, 2013-07-17 09:14:51

У меня есть решение, если кому-то интересно. Предполагается, что SQL должен быть написан по-другому. Вот что сработало для меня:

// Search the rows in the markers table
$select = $readConnection->select()
    ->from(
        array('os' => $resource->getTableName('your_table')),
        array(
            'address', 'name', 'lat', 'lng',
            'distance' => new Zend_Db_Expr("( 3959 * acos( cos( radians({$center_lat}) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians({$center_lng}) ) + sin( radians({$center_lat}) ) * sin( radians( lat ) ) ) )")
        )
    )
    ->having("distance < ?", $radius)
    ->limit(20)
    ->order('distance');

$results = $readConnection->fetchAll($select);
 2
Author: jdhaar, 2015-03-06 11:30:19