2011-02-12 22 views
25

que solía tener esto como una de las opciones (cuarto param) pasó a DOP constructor:PDO :: exec() o PDO :: query()?

$aOptions[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8"; 

Pero acaba de encontrar que no funciona en algunas versiones de PHP en Windows (no funciona en 5.3) debido a algún error.

ahora tengo que correr SET NAMES utf8 utilizando $pdo->exec("SET NAMES utf8");

o $pdo->query("SET NAMES utf8");

justo después de la instancia del objeto pdo. Entonces, ¿cuál debería usar - exec() o query()?

+2

¿Notaste alguna diferencia? –

+3

Feliz de ver a otra persona usando PDO en lugar de esas horribles funciones mysql_query.:) – awm

+0

Lo he estado utilizando durante mucho tiempo, pero recientemente comencé a desarrollar en mi PC hogareña que es Windows, y ahora algunos errores relacionados con Windows comienzan a aparecer – Dmitri

Respuesta

42

Al usar PDO::EXEC, el resultado devuelto no es PDOStatement sino un número entero de las filas afectadas.

Al usar PDO::QUERY el resultado devuelto es PDOStatement.

Así que la respuesta depende de lo que necesite hacer con los datos, si necesita ejecutar consultas y no hacer nada con los resultados, entonces debe usar exec para ejecutar la consulta; de lo contrario, si necesita el número de filas, los datos devueltos deben usar pdo::query y luego usar los resultados devueltos por la llamada.


en lo que respecta al fallo hay varios trabajos en torno a que se puede tomar

  • Instalar PDO_MYSQL
  • Reemplazar MYSQL_ATTR_INIT_COMMAND con 1002
  • Actualice su PHP A la última versión estable donde se aprobó y se parcheó.

el segundo problema puede tener algunos problemas en el sistema operativo de 64 bits y algunas configuraciones de Windows.

Información de error: http://bugs.php.net/bug.php?id=47224

+0

Estoy en Windows de 64 bits, así que tal vez esto esté relacionado. De todos modos, solo usaré $ pdo-> exec ("SET NAMES utf8"); en constructor en lugar de pasarlo como argumento. – Dmitri

+0

¿Qué versión de PHP tienes? – RobertPitt

4

PDO :: exec() se debe utilizar para consultas que no devuelven un conjunto de resultados, tales como una instrucción de eliminación o 'set'. PDO :: query() debe usarse cuando espere que se devuelva un conjunto de resultados. Devuelve un objeto PDOStatement al que puede iterar para obtener las filas individuales. Sin embargo, tenga en cuenta que si utiliza datos de una fuente que no es de confianza en sus consultas, las declaraciones preparadas serían la mejor manera de realizar cualquier tipo de consulta (pero es probable que lo supiera).

Por lo tanto, en su caso PDO :: exec() sería correcto. ¿Estás seguro de que pasar el comando set names a PDO :: __ construct() ya que el último valor no funciona? Funciona para mí y tengo PHP 5.3 en Windows. ¿Podría publicar un código de muestra más de lo que está haciendo?

+0

Sí, estoy seguro. Estoy obteniendo esto: PHP Fatal error: Constante de clase no definida 'MYSQL_ATTR_INIT_COMMAND' – Dmitri

+0

Dmitri, Hay un error que debería ver: http://bugs.php.net/bug.php?id=47224 El trabajo temporal sería usar '1002' instad de la constante – RobertPitt

+0

Parece que el error no existe si usa el nuevo controlador mysqlnd en Windows. Esto es lo que estoy usando y por eso el error no existe para mí. También se supone que Mysqlnd ofrece un mejor rendimiento que el antiguo controlador libmysql ... – Jeremy