PHP PDO prepare()预处理语句不起作用,但query()有效

时间:2017-06-07 10:40:18

标签: php database pdo sqlite

无法让这些PDO准备好的语句发挥作用。在Windows / MAMP和SQLite上使用PHP 7.0.9。

PHP PDO驱动程序pdo_sqlite已安装版本3.8.10.2

任何人都知道我在这里做错了什么?

这可以按预期工作:

$st = $pdo->query("SELECT * FROM `e48` WHERE `parallel` >= 4000 AND `parallel` <= 4010");
$results = $st->fetchAll();

这不起作用,结果为零:

$st = $pdo->prepare("SELECT * FROM `e48` WHERE `parallel` >= :x AND `parallel` <= :y");
$st->execute(array(':x' => 4000, ':y' => 4010));
$results = $st->fetchAll();

这也不起作用:

$st = $pdo->prepare("SELECT * FROM `e48` WHERE `parallel` >= 4000 AND `parallel` <= :y");
$st->execute(array(':y' => 4010));
$results = $st->fetchAll();

最终给我的结果如下:

SELECT * FROM `e48` WHERE `parallel` >= 4000

P.S还在Linux虚拟机Web服务器上测试,结果相同。

2 个答案:

答案 0 :(得分:0)

我已经解决了。

我使用TEXT SQLite datatype作为parallel列,当我将其切换为REAL时(它们都是浮点数),它可以正常工作。因此,数据库中的值以前存储为(首选)文本字符串。

将其更改为REAL后,现在可以使用预先准备好的语句。

参考:Type Conversions Prior To Comparison

为什么$pdo->query("SELECT * FROM e48 WHERE parallel >= 4000 AND parallel <= 4010")有效?

  

如果一个操作数具有INTEGER,REAL或NUMERIC亲和性,而另一个操作数具有TEXT或BLOB或没有亲和力,则NUMERIC亲和性将应用于其他操作数。

右侧操作数被视为具有NUMERIC亲和力,因此比较按预期工作。

为什么没有$pdo->prepare("SELECT * FROM e48 WHERE parallel >= :x AND parallel <= :y")工作?

  

如果一个操作数具有TEXT亲和性而另一个没有亲和性,则TEXT亲和性将应用于另一个操作数。

将PHP PDO与SQLite结合使用时,右侧操作数被视为具有无关联性,因此比较被视为具有TEXT亲和力,后者又变为无操作比较。

答案 1 :(得分:-1)

public class DiscoveryListener
{
    WorkGroupEventHandler workGroupEventHandler;

    private AsyncTask<Void, Void, Void> asyncTask;
    private boolean listener_active = false;

    public boolean GetListener_active()
    {
        return listener_active;
    }

    public DiscoveryListener(WorkGroupEventHandler eventHandler)
    {
        workGroupEventHandler = eventHandler;
    }

    public void Start()
    {
        if (listener_active == false)
        {
            listener_active = true;
            RunUdpListener();
        }
    }

    public void Stop()
    {
        listener_active = false;
        asyncTask.cancel(true);
    }

    public void RunUdpListener()
    {
        asyncTask = new AsyncTask<Void, Void, Void>()
        {

        @Override
        protected Void doInBackground(Void... params)
        {
            byte[] msg = new byte[4096];
            DatagramPacket datagramPacket = new DatagramPacket(msg, msg.length);
            MulticastSocket multicastReceiveSocket = null;

            try
            {
                multicastReceiveSocket = new MulticastSocket( 60000 );

                while (listener_active)
                {
                    if (isCancelled() == false)
                    {
                        multicastReceiveSocket.receive(datagramPacket);
                        ProcessIncommingMessage(datagramPacket.getAddress(), msg);
                    }
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                if (multicastReceiveSocket != null)
                {
                    multicastReceiveSocket.close();
                }
            }

            return null;
            }
        };

        asyncTask.execute();
    }
}


@RunWith(PowerMockRunner.class)
@PrepareForTest({android.util.Log.class, android.os.AsyncTask.class})
public class DiscoveryListenerUnitTest
{
    private WorkGroupEventHandler eventHandler = new WorkGroupEventHandler()
    {
        @Override
        public void onWorkGroupEventHandle(String IpAddress, String Workgroup, String SerialNumber)
        {
        }
    };

    private DiscoveryListener discoveryListener = new DiscoveryListener(eventHandler);
    private AsyncTask asyncTask;

    @Test
    public void discoveryListener_doesStart() throws Exception
    {
        PowerMockito.mockStatic(android.util.Log.class);

        PowerMockito.whenNew(AsyncTask.class).withNoArguments().thenReturn(asyncTask);
        asyncTask = PowerMockito.mock(AsyncTask.class);
        when(asyncTask.execute()).thenReturn(null);

        discoveryListener.Start();
        assertEquals(true, discoveryListener.GetListener_active());
    }
}