2016-05-25 2 views
1

У меня есть устаревшее приложение, которое использует функции mysqli_*() (на самом деле оно использует функции mysql_*().Gah!). Я использую aura/sqlquery в качестве генератора запросов SQL. Например:Переменная привязка в ауре/sqlquery при использовании соединения mysqli_ *

$queryFactory = new Aura\SqlQuery\QueryFactory('mysql'); 
$select = $queryFactory->newSelect(); 
$select->from('sometable AS t') 
    ->where('t.field1 = 0') 
    ->where("t.field2 <> ''"); 

Тогда мы получим необработанный SQL литья в строку:

$sql = (string) $select; 

Теперь я хочу сделать сделать какое-либо переменное связывание в where():

$select->where('t.somefield = ?', $somevalue); 

Когда я литье в строку, escape-привязка никогда не возникает. Похоже, что привязка имеет место только при использовании PDO и подготовленных операторов.

Любые идеи о том, как получить переменную привязку в aura/sqlquery при использовании соединения mysqli?

+1

Я полагаю, что требуется построитель запросов, и вы не хотите, чтобы решение работало с необработанным SQL? –

+0

@YourCommonSense Я предпочитаю использовать построитель запросов для обработки сложных объединений. Например, если модель пользователя имеет несколько методов, которым требуется несколько соединений, то легко выполнить эти общие объединения в одном вспомогательном методе, а затем передать объект '$ select'. Управление сырым SQL-текстом кажется мне громоздким. –

+0

Да, я вижу. Но все равно. Ваше требование не ясно для меня. Вам нужно получить только исходный SQL-код, который будет использоваться с функциями mysql_, и это единственный вариант? –

ответ

0

Чтобы получить значения привязки, вы можете использовать $select->getBindValues().

Я скажу, что используйте Aura.Sql, чем pdo, потому что это помогает вам в некоторых других случаях, например, IN().

Взяв пример из readme.

// a PDO connection 
$pdo = new PDO(...); 

// prepare the statment 
$sth = $pdo->prepare($select->getStatement()); 

// bind the values and execute 
$sth->execute($select->getBindValues()); 

Сообщите мне, если вам нужно больше разъяснений.

спасибо.

+0

Спасибо за быстрый ответ. Я понимаю, что могу использовать эти значения привязки для использования с PDO. Проблема заключается в том, как создать необработанный SQL, который я могу использовать с mysql или mysqli. –

+1

Нет другого способа, о котором я знаю :(. –

1

Если PHP версии> = 5,6, здесь есть функция, которую можно использовать для выполнения запроса от ауры/SQLQuery против MySQLi

function mysqli_query_params($mysqli, $query, $params, $types = NULL) 
{ 
    $statement = $mysqli->prepare($select); 
    $types = $types ?: str_repeat('s', count($params)); 
    $statement->bind_param($types, ...$params); 
    $statement->execute(); 
    return $statement; 
} 

используется как этот

mysqli_query_params($mysqli, $select->getStatement(), $select->getBindValues()) 
+1

Я думаю, что «Дэвид Вайнрауб» - это ответ, который вам может понадобиться для вас, вы хотите использовать соединение mysqli, а не pdo. –