无法让这些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服务器上测试,结果相同。
答案 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());
}
}