Не удается подключиться к локальному серверу 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)
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
У меня есть решение, если кому-то интересно. Предполагается, что 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);